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 回答