2009-06-19 3 views
1

非常に長いループを含むメソッドでテストサービスを作成しました。私は、タイムアウトトランザクションが発生したときにメソッドの実行がフラッシュされることを期待していましたが、そうではありません。クライアントはタイムアウトを取得しますが、処理はサーバー上で継続されます。トランザクションのタイムアウト後にWCFでメソッド呼び出しの実行を停止する方法

これを停止する方法はありますか?メソッドコードを変更することなく?

例です:この例では、キューバインディングを使用してメソッドQueueRequestを呼び出し、10秒後にトランザクションがアボートされます。この時点で再試行が発生し、同じ問題が発生します。数回の再試行の後、サーバーは100%CPUを使用してメッセージが複数のスレッド/インスタンスに対してループを実行しようとしています。


// NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in App.config. 
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, 
     TransactionTimeout="00:00:10", 
     ReleaseServiceInstanceOnTransactionComplete=true)] 
    [ErrorHandlingBehaviorAttribute] 
    public class Service1 : IQueueService 
    { 
     public Service1() 
     { 
     Trace.WriteLine("Creating an instance on thread " + Thread.CurrentThread.ManagedThreadId.ToString()); 
     } 

     ~Service1() 
     { 
     Trace.WriteLine("Destroying an instance on thread " + Thread.CurrentThread.ManagedThreadId.ToString()); 
     } 


     [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
     public void QueueRequest(string message) 
     { 
     int id = Thread.CurrentThread.ManagedThreadId; 
     Trace.WriteLine("Got Message on thread " + id.ToString()); 
     for (int i = 0; i < 1000000; i++) 
     { 
      Trace.WriteLine("Processing " + i.ToString() + " Thread ID " + id.ToString()); 
      Thread.Sleep(1000);   
     } 
     } 
    } 

答えて

1

私は、これは既存のコードを変更せずに可能であるとは思いません。

herehereをご覧ください。要求を処理するスレッドは、WCFの部分から完全に切り離され、結果がクライアントに渡されます。

+0

ありがとうございました。情報のために。 – user80855

関連する問題