Come creare un thread specifico di richiesta Safe Static int Contatore?

1

In una delle mie applicazioni server ho una classe che assomiglia,

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++;
   }
}

Il problema è SomeAsyncMethods async. Può essere chiamato più volte. Cosa mi serve quando una richiesta avvia set _value = 0 e quindi incrementa in modo asincrono questo valore. Dopo la fine della richiesta ho bisogno del totale. Ma il problema è che un'altra richiesta allo stesso tempo può accedere alla classe.

    
posta user960567 10.12.2012 - 13:49
fonte

1 risposta

4

utilizzo

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

invece di

_value++;

Interlocked.Increment

Se più richieste condividono questa classe e ognuno dovrebbe ottenere il proprio contatore, è necessario un contatore non statico che passi a tutti i thread che lavorano su questa richiesta.

In questo modo

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 );
    }
}
    
risposta data 10.12.2012 - 13:54
fonte

Leggi altre domande sui tag