C# – How to Create a Request Specific Thread Safe Static int Counter

asp.netcmultithreading

In one of my server application I have a class that look like,

class A
{
   static int _value = 0;
   void DoSomething()
   {
         // a request start here
          _value = 0;
         _value++;
         // a request end here
   }
   // This method can be called many time during request
   void SomeAsyncMethods()
   {
         _value++;
   }
}

The problem is SomeAsyncMethods is async. Can be called many times. What I need when a request start set _value = 0 and then asynchrosnously increment this. After end of request I need the total. But the problem is that another request at the same time can access the class.

Best Answer

use

System.Threading.Interlocked.Increment( ref _value );

instead of

_value++;

Interlocked.Increment

If multiple requests share this class and each one should get its own counter you need a non static counter that you pass to all threads working on this request.

Like this

class A
{
    void DoSomething()
    {
        // a request start here
        RequestData data = new RequestData();
        request.IncrementValue();
        // a request end here
    }

    // This method can be called many time during request
    void SomeAsyncMethods( RequestData request )
    {
        request.IncrementValue();
    }
}

class RequestData
{
    int _value = 0;

    public void IncrementValue()
    {
        System.Threading.Interlocked.Increment( ref _value );
    }
}
Related Topic