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

我有一个类将日志信息保存到数据库(在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; } } 

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

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

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

下面是它的工作原理。

 public class DedicatedThread { private BlockingCollection actions = new BlockingCollection(); 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(); }