2017-11-21 3 views
-2

Webページ(RESTを使用)に対して定期的なチェックを行い、最終的な応答を待つ機能を持っています。 「最終的な」応答を返します。CancellationToken.WaitHandle.Set()が見つからないか、タスクが完了したことを示す方法

void PeriodicallyCheckSomething() 
{ 
    Task.Run(() => { 
     var isTaskComplete = false; 
     while (!isTaskComplete) 
     { 
      CancellationToken.WaitHandle.Wait(5000); 
      if (isTaskComplete || CancellationToken.IsCancellationRequested) 
       return; 

      CheckProgress((isComplete) => { 
       isTaskComplete = isComplete; 
       CancellationToken.WaitHandle.Set(); // <== can't do this 
      }); 
     } 
    }); 
} 

// CheckProgress - exit's immediately, we use updateStatus to report the result 

void CheckProgress(Action<bool> updateStatus) 
{ 
    MakeWebRequest((data) => { 
     var isComplete = (data.Result == 999); 
     updateStatus(isComplete); 
    }); 
} 

私はタスクをきれいに終了したいと思います。結果が得られたらisTaskCompleteフラグをセットしますが、タスクはすでに待機状態です。

タスクがすぐに終了するようにWaithandleを「設定」したいと思います。ただし、CancellationToken.WaithandleにはSet関数がありません。

待っている方がいいですか?タスクキャンセルとSetのようなものを使ってそれを通知する機能の両方をサポートしますか?

+0

あなたが持っているコードは間違っていますが、その同じ美徳によってあなたが望む最終結果がはっきりしないことは明らかです。たとえば、キャンセルトークンをチェックする以外に何もやっていないのはなぜですか? – theMayer

+0

CancellationTokenSource.Cancel()はこの関数の外部で呼び出されます。たとえば、ユーザーがUIのキャンセルボタンを押したとします。 –

+0

はい、あなたがすべき唯一のことはそれを確認する理由です。 – theMayer

答えて

0

私がしたことは、MakeWebRequestをブロック機能にすることでした。

void PeriodicallyCheckSomething() 
{ 
    Task.Run(() => { 
     var isTaskComplete = false; 
     while (!isTaskComplete) 
     { 
      CancellationToken.WaitHandle.Wait(5000); 
      if (CancellationToken.IsCancellationRequested) 
       return; 

      isTaskComplete = CheckProgress(); 
     } 
    }); 
} 

bool CheckProgress() 
{ 
    var data = MakeWebRequest(); 
    return (data.Result == 999); 
} 
0

Task.Delayを使用して5000msを待ちます。 CancellationTokenをその過負荷の1つを介してDelayメソッドに渡すことができます。私は完了の概念と取り消しの概念を追跡する必要がある理由は見ていません。あなたは単にタスクを無関係に終わらせたいだけです。

0

私はあなたがする必要があると思うのは、タスクを起動させ、それにキャンセルトークンを供給し、タスクの「外部」待機を実行することだと思います。つまり、PeriodicallyCheckSomething()メソッドを別の場所からasyncとTask.Runとして再ラベル付けすることができます。それで、どこか他の人が待っているなど、私の2cだけを実行できます。 幸運

関連する問題