• Sign in to Neowin Faster!

    Create an account on Neowin to contribute and support the site.

  • 0
Sign in to follow this  

C# IDistributedCache Multi-Thread Approach Question

Question

firey    3,873

I have a project that users send data to a server written in C#. The users have the ability to send an action against an object. To reduce DB Traffic, I am using IDistributedCache to hold the instance of the main object, as it also allows for cross-server shared caching.

I am running into an issue with multiple threads where two people send an action to the server. Each thread calls the same function which loads up the instance of the object from the IDistributedCache (using _cache.getAsync(,....)).  This results in each thread effectively ending up with it's own instance of the object.  The issue is that whatever thread finished last, ends up writing that instance of the object back to the cache, thus losing any changes made in the other thread as the modified object isn't what the current thread has in it's memory.

 

I was thinking that I could use a standard hashtable/dictionary and just reference the object directly ie: objdict[objid].actions.add(action). That way I have one instance in memory that all threads would have the same state for. However, doing it that way I have no way to support distribution like I do with the IDistributedCache.

 

I am wondering if anyone has dealt with this, or has any idea of how can I make it so that both threads get the same reference to the object (akin to using the dictionary), but keep it so it can be split across servers (distributed). 

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 0
Jonathans    7

I worked on a project a few years ago where we had a similar scenario. We had similar issues and many solutions put forward for tests. Included queuing the object instance between threads so that the instance was ONLY active in one thread.

The final solution though, didnt go this route, but what was done was to take the principal of a shared whiteboard. By this i mean each thread gets a new instance of the 'core' instance, but with triggers to each instance to push through from the child instance to the core, and from the core push those changes to each subsequent child.

This solution worked but did also suffer from the same race condition, but on a smaller basis, that was resolved by discarding any changes to the sub-properties at the lowest level on a rule of Who Makes Changes First keeps them.

 

Don't think this will help you much, but i hope it helps give you an idea...

Share this post


Link to post
Share on other sites
  • 0
Jonathans    7
2 minutes ago, Jonathans said:

I worked on a project a few years ago where we had a similar scenario.

Also we were using a state engine of sorts, not IDistributedCache, but principal was similar

Share this post


Link to post
Share on other sites
  • 0
virtorio    3,025

Without knowing the specifics of the system and data, it sounds like you shouldn't be caching the data if your actions are modifying it.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.