1

コードは次のようになります。

public class JobManager
{
    public static void TrackExceptionCount(ref int exceptionCount)
    {
        Interlocked.Increment(ref exceptionCount);
    }

    //other helper methods
}

次のような他の場所でこのメソッドを呼び出します。

private static int _exceptionCount;

JobManager.TrackExceptionCount(ref _exceptionCount);

Interlocked.Increment がスレッドセーフの問題を処理すると思いましたよね?

編集:

次のような Job クラスが複数あります。

class JobA
{
    private static int _exceptionCount;

    public void method1()
    {
       Task.Factory.Start(()=>{
         try
         {
             //Some code
         }
         catch(exception ex)
         {
            JobManager.TrackExceptionCount(ref _exceptionCount);
         }
       });
    }

    public void method2()
    {
       Task.Factory.Start(()=>{
         try
         {
             //Some code
         }
         catch(exception ex)
         {
            JobManager.TrackExceptionCount(ref _exceptionCount);
         }
       });
    }
}

class JobB
{
    private static int _exceptionCount;

    public void method1()
    {
       Task.Factory.Start(()=>{
         try
         {
             //Some code
         }
         catch(exception ex)
         {
            JobManager.TrackExceptionCount(ref _exceptionCount);
         }
       });
    }

    public void method2()
    {
       Task.Factory.Start(()=>{
         try
         {
             //Some code
         }
         catch(exception ex)
         {
            JobManager.TrackExceptionCount(ref _exceptionCount);
         }
       });
    }
}

catch ブロックで Interlocked.Increment を直接呼び出す方がおそらく良い方法だと思います。

ただし、 JobManager.TrackExceptionCount(ref _exceptionCount) がおそらく機能するかどうかを知りたい

ありがとう。

4

1 に答える 1

0

Interlocked.Incrementへの呼び出しが保存場所の唯一の使用であると仮定すると、_exceptionCountこれは安全です。refパラメータを安全に渡すことができます。それらは、変数へのマネージ ポインターのように機能します (内部的にはそうです)。

于 2012-11-27T00:26:13.960 に答える