2017-03-09 6 views
0

トランザクションが完了したかどうかを判断しようとしていますが、結果によっては別のスレッドで他の処理をしたいと考えています。処理後の取引状況の確認

private static void ProcessActions() 
{ 
    while(true) 
    { 
     action = pendingActions[0]; 
     if (action.CurrentTransaction == null || 
      action.CurrentTransaction.TransactionInformation.Status == TransactionStatus.Committed) 
     { 
      // Proceed to do things!! 
      remove = true; 
     } 
     else if (action.CurrentTransaction.TransactionInformation.Status == TransactionStatus.Aborted) 
     { 
      // Transaction has aborted. Remove this action from the list 
      remove = true; 
     } 

     if (remove) 
     { 
      lock (pendingActions) 
      { 
       pendingActions.Remove(action); 
       eventCount = pendingActions.Count; 
      } 
     } 
    } 
} 

私が設定:別のスレッドで、私は類似の取引を持っているオブジェクトのリストを通過しています、別のクラスでは、今

using (TransactionScope scope = new TransactionScope()) 
{ 
    // Do stuff 

    Scope.Complete(); 
} 

は、以下のTransactionScopeを考えてみましょうコンストラクタで新しいアクションを作成しているときのアクションのCurrentTransaction:

public Action() 
{ 
    CurrentTransaction = System.Transactions.Transaction.Current; 
} 

問題は、他のスレッドがアクションを処理しているときに、action.CurrentTransactionが破棄され、System.ObjectDisposedExceptionがスローされることです。

アクション内の各トランザクションのステータスを把握するにはどうすればよいですか?

+0

達成しようとしていることはありますか? – VMAtm

+0

@ VMAtm私は単に、各アクションのトランザクションがまだ処理中であるか、中断しているのか、コミットしているのかを確認してから、他のアクションを実行することを確認したかっただけです。私は解決策を見つけたと思う。下の私の答えをチェックしてください。 –

答えて

2

私はTransaction.TransactionCompleted Eventを利用して解決策を見つけたと信じています。

私はTransactionCompletedイベントにデリゲートを割り当てるために以下のコードを使用:その方法では

System.Transactions.Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(Mother.Current_TransactionCompleted); 

、私は私の行動を反復処理し、対応する元のトランザクションを持っているかを判断することができました。このように:

public static void Current_TransactionCompleted(object sender, TransactionEventArgs e) 
{ 
    var originatingTransaction = sender as System.Transactions.Transaction; 

    lock (pendingActions) 
    { 
     for (int i = pendingActions.Count - 1; i >= 0; i--) 
     { 
      var action = pendingActions[i]; 

      if (originatingTransaction.Equals(action.CurrentTransaction)) 
      { 
       var transactionStatus = e.Transaction.TransactionInformation.Status; 
       if (transactionStatus == TransactionStatus.Committed) 
       { 
        // Later in the code, I will do stuff if CurrentTransaction is null 
        action.CurrentTransaction = null; 
       } 
       else if (transactionStatus == TransactionStatus.Aborted) 
       { 
        // if It's aborted, I will remove this action 
        pendingActions.RemoveAt(i); 
       } 
       // I will skip processing any actions that still have a Transaction with the status of "Processing" 
      } 
     } 
    } 
} 
関連する問題