2011-08-24 13 views
0

これは他の場所で説明されていますが、見つからない場合があります。私は、日付範囲をループし、計算を実行し、データベース内のレコードを更新する機能を持つ.Net Web Serviceを持っています。この機能に長い日付範囲を指定すると、完了するまでにかなりの時間がかかることがあります。この場合、私はこの機能を停止する方法が必要です。方法:Webサービス機能要求を取り消します。

特定のスレッドでWebサービス関数呼び出しを実行させる方法がありますので、必要に応じてそのスレッドをキャンセルできますか?あるいは、私はこれ以上のことを考えていますか?私は、C#.Net Web PageをjQueryと共に使用して、Webサービス機能へのAJAX呼び出しを実行しています。どんな助けでも大歓迎です。

+0

スレッドをキャンセルすることを決定したユーザー:呼び出し元、またはWebサービス実装(おそらくタイムアウトに基づく)? –

答えて

1

は、状態変数を設定し、Webサービスへのキャンセル()メソッドを追加します。その後、長期的な運用を定期的に行うことで、この変数を定期的にチェックし、そのセットが適切な保護を備えていれば停止します。あなたは、Webサービスメソッドに必要

+0

私は単純さのためにあなたの答えを見落としたとは思えません。しかし、オッカムのカミソリが示唆しているように、最も簡単なのは最良の答えです。他の回答を調べた後、私の質問で参照したように、Tejsの答えはスレッドをキャンセルすることを示唆していますが、コミットされていないデータベーストランザクションが残っている可能性があります。だから、私はあなたの答えをもっと考えました。あなたのメソッドでは、私は 'キャンセル'呼び出しで状態(またはセッション)変数を設定し、ループの次の反復時に、その変数をチェックして、その方法で、処理中のトランザクションはコミットされ、孤立したままになりません。 – Keith

+0

私はそれが助けてうれしいです。見逃しを心配しないでください - これはプログラミングの次の組み合わせです; – AdamC

0

もちろん、そうすることができます。あなたは.NET 4を使用している場合は、簡単にタスクをキャンセルすることができます

CancellationTokenSource cts = new CancellationTokenSource(); 
var processingTask = Task.Factory.StartNew(() => 
    { 
      foreach(var item in StuffToProcess()) 
      { 
       cts.Token.ThrowIfCancellationRequested(); 

       // Do your processing in a loop 
      } 
    }); 

    var cancelTask = Task.Factory.StartNew(() => 
     { 
      Thread.Sleep(/* The time you want to allow before cancelling your processing */); 
      cts.Cancel(); 
     }); 

    try 
    { 
     Task.WaitAll(processingTask, cancelTask); 
    } 
    catch(AggregateException ae) 
    { 
     ae.Flatten().Handle(x => 
      { 
       if(x is OperationCanceledException) 
       { 
        // Do Anything you need to do when the task was canceled. 
        return true; 
       } 

       // return false on any unhandled exceptions, true for handled ones 
      }); 
    } 
+0

これは私が望むものに近いように見えますが、ユーザーがこの機能への要求のキューを表示し、特定のものを取り消すことができるという要件があります。一度に1〜20件のリクエストが発生する可能性があり、特定のリクエストをキャンセルできる必要があります。 – Keith

+0

その場合、そのオブジェクトの参照を、何らかの種類の共有された所有者に任せておく必要はありません。次に、Webマネージャは、その上で 'cts.Cancel()'を呼び出すことを選択します。指定されたトークン。 – Tejs

+0

私はすでにキューオブジェクトを追跡しています(どの日付範囲を同期するよう要求したのかを追跡するdb内のエントリのみ)。では、そのスレッドのトークンを取得してDBに追加できるようにするにはどうすればいいですか?上記のコードを使用してそのスレッドをキャンセルしますか? – Keith

1

:長時間実行される操作をspanwsと長いを終了することによって、計算をキャンセルするID

  • CancelCalculation(ID)を返し

    1. StartCalculation(PARMS)実行中の操作。

    「長期実行操作」の実装は、サービスホスト(IIS、Windowsサービスなど)によって異なります。

  • +0

    これはAdamの勧告にも似ています。私は最初、単純さのためにこれらの答えを見落としました。しかし、アダムの答えを見て、なぜ私がそれを選んだのかについての私の発言を見てください。 – Keith

    +0

    アダムの答えとの主な違いは、あなたが操作を識別するIDを返す必要があると信じている、そうでなければ複数のクライアントをサポートすることができないということです。 IDなしでは、実行中の操作が複数ある場合に、どの操作をキャンセルするのか分かりません! –

    +0

    はい、反復が発生しているかどうかを追跡するログテーブルがあり、その反復のIDを返します。キャンセルをクリックすると、そのIDがキャンセル関数に渡され、アプリケーション変数がそのIDに設定されてキャンセルされます次の反復では、idを持つものを取り消します。情報をありがとう – Keith

    関連する問題