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のようなものを使ってそれを通知する機能の両方をサポートしますか?
あなたが持っているコードは間違っていますが、その同じ美徳によってあなたが望む最終結果がはっきりしないことは明らかです。たとえば、キャンセルトークンをチェックする以外に何もやっていないのはなぜですか? – theMayer
CancellationTokenSource.Cancel()はこの関数の外部で呼び出されます。たとえば、ユーザーがUIのキャンセルボタンを押したとします。 –
はい、あなたがすべき唯一のことはそれを確認する理由です。 – theMayer