2012-03-21 5 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

これは素晴らしいですが、私の方法の多くはいくつかのパラメータを持っています。大部分は 'string'と' int'ですが、私はそれらを渡す必要があります。この設定でこれを行う方法はありますか? (これはメソッドを呼び出すだけのようですが、各呼び出しでパラメータを使用することはできません)。 – Vaccano

+2

@Vaccano:代わりに 'Action 'を使用することができます。あるいは、ラムダ式を使って 'Action'デリゲートを構築するときには、変数をクローズすることができます。 –

関連する問題