有条件地在单独的线程上运行类的方法

时间:2012-03-21 19:15:52

标签: c# .net multithreading

我有一个类将日志信息保存到数据库中(在NServiceBus消息Handle方法中)。

大多数情况下,日志记录可以在主进程的单独线程(和事务)上完成。但这一切都需要在同一个后台线程上完成(这意味着它们必须按顺序完成,而不是与主进程同步)。

但是,一旦它从NServiceBus启动Foreign Keying到实际数据,它就需要在同一个线程上。

以下是一些示例代码:

public class MyExample
{

   public void LogSomeStuff(Stuff stuff)
   {
      using (MoveOutsideTransaction())
      {
         // Do Method Stuff here
         dataAccess.SaveChanges();
      }
   }


   public void LogSomeOtherStuff(Stuff stuff)
   {
      using (MoveOutsideTransaction())
      {
         // Do Other Method Stuff here
         dataAccess.SaveChanges();
      }
   }

   private IDisposable MoveOutsideTransaction()
   {
       if (loggingOutsideTransaction)
           return new TransactionScope(TransactionScopeOption.Suppress);

       return null;
   }
}

我想知道是否有办法使用我的事务条件也有条件地将运行移动到另一个线程。 (但只有当它抑制交易时。)

1 个答案:

答案 0 :(得分:2)

  

我想知道是否有办法使用我的交易条件   还有条件地将运行移动到另一个线程。

您不能只是将方法的执行移动到不同的线程上。一般来说,线程不会那样工作。但是,您可以做的是设置一个专用线程,该线程可以参与编组操作,该操作或多或少地模拟执行到另一个线程的传输。重要的是要将这个专用线程专门编码以接受这种封送操作。

以下是它的工作原理。

public class DedicatedThread
{
  private BlockingCollection<Action> actions = new BlockingCollection<Action>();

  public DedicatedThread()
  {
    var thread = new Thread(
      () =>
      {
        while (true)
        {
          Action action = actions.Take();
          action();
        }
      });
  }

  public void SubmitAction(Action action)
  {
    actions.Add(action);
  }
}

你可以这样使用它。

if (loggingOutsideTransaction) 
{  
  // Execute asynchronously on a dedicated thread.
  dedicatedThread.SubmitAction(yourActionDelegate); 
}
else
{
  // Execute synchronously.
  yourActionDelegate();
}