Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Store the cache data locally

I develops a C# Winform application, it is a client and connect to web service to get data. The data returned by webservice is a DataTable. Client will display it on a DataGridView.

My problem is that: Client will take more time to get all data from server (web service is not local with client). So I must to use a thread to get data. This is my model:

Client create a thread to get data -> thread complete and send event to client -> client display data on datagridview on a form.

However, when user closes the form, user can open this form in another time, and client must get data again. This solution will cause the client slowly.

So, I think about a cached data:

Client <---get/add/edit/delete---> Cached Data ---get/add/edit/delete--->Server (web service)

Please give me some suggestions. Example: cached data should be developed in another application which is same host with client? Or cached data is running in client. Please give me some techniques to implement this solution.

If having any examples, please give me.

Thanks.

UPDATE : Hello everyone, maybe you think my problem so far. I only want to cache data in client's lifetime. I think cache data should be stored in memory. And when client want to get data, it will check from cache.

like image 493
Leo Vo Avatar asked Oct 14 '25 14:10

Leo Vo


2 Answers

If you're using C# 2.0 and you're prepared to ship System.Web as a dependency, then you can use the ASP.NET cache:

using System.Web;
using System.Web.Caching;

Cache webCache;

webCache = HttpContext.Current.Cache;

// See if there's a cached item already
cachedObject = webCache.Get("MyCacheItem");

if (cachedObject == null)
{
    // If there's nothing in the cache, call the web service to get a new item
    webServiceResult = new Object();

    // Cache the web service result for five minutes
    webCache.Add("MyCacheItem", webServiceResult, null, DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
}
else
{
    // Item already in the cache - cast it to the right type
    webServiceResult = (object)cachedObject;
}

If you're not prepared to ship System.Web, then you might want to take a look at the Enterprise Library Caching block.

If you're on .NET 4.0, however, caching has been pushed into the System.Runtime.Caching namespace. To use this, you'll need to add a reference to System.Runtime.Caching, and then your code will look something like this:

using System.Runtime.Caching;

MemoryCache cache;
object cachedObject;
object webServiceResult;

cache = new MemoryCache("StackOverflow");

cachedObject = cache.Get("MyCacheItem");

if (cachedObject == null)
{
    // Call the web service
    webServiceResult = new Object();

    cache.Add("MyCacheItem", webServiceResult, DateTime.Now.AddMinutes(5));
}
else
{
    webServiceResult = (object)cachedObject;
}

All these caches run in-process to the client. Because your data is coming from a web service, as Adam says, you're going to have difficulty determining the freshness of the data - you'll have to make a judgement call on how often the data changes and how long you cache the data for.

like image 161
PhilPursglove Avatar answered Oct 17 '25 02:10

PhilPursglove


Do you have the ability to make changes/add to the webservice?

If you can Sync Services may be an option for you. You can define which tables are syncronised, and all the sync stuff is managed for you.

Check out

http://msdn.microsoft.com/en-us/sync/default.aspx

and shout if you need more information.

like image 33
JohnnyJP Avatar answered Oct 17 '25 02:10

JohnnyJP



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!