2012-03-21 34 views
5

我有一個類將日誌信息保存到數據庫(在NServiceBus消息Handle方法中)。有條件地在一個單獨的線程上運行一個類的方法

大多數情況下,日誌記錄可以在主流程的單獨線程(和事務)上完成。但是這一切都需要在同一個後臺線程上完成(這意味着它們必須按順序完成,而不是與主進程同步)。

但是,一旦它啓動外部鍵控從NServiceBus的實際數據,它需要在同一個線程。

下面是一些示例代碼:

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

我想知道是否有使用我的交易條件也有條件地移動運行在不同的線程的方式。 (但只有當它抑制了交易。)

回答

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(); 
} 
+0

這看起來不錯,但我的許多方法有幾個參數。大多數是'字符串'和'int's,但我需要通過它們。有沒有辦法做到這一點與此設置? (這似乎只是調用方法,但不允許參與每個調用。) – Vaccano 2012-03-21 20:46:57

+2

@Vaccano:您可以使用「動作」來代替。或者,當通過lambda表達式構建'Action'委託時,您可以對變量執行閉包。 – 2012-03-21 21:59:26

相關問題