缺少 CancellationToken.WaitHandle.Set() 或如何指示任务已完成

Missing CancellationToken.WaitHandle.Set() or how to indicate that a task is complete

我有一个功能可以定期检查网页(使用 REST),然后等待最终响应,如果它收到 "non-final" 响应,它会再次尝试。

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 标志,但任务已经处于等待状态。

我想 "Set" Waithandle 以便 Task 立即退出。但是 CancellationToken.Waithandle 没有 Set 函数。

是否有更好的 Wait... 方法,既支持任务取消又支持使用 Set 之类的方式发出信号?

使用Task.Delay等待5000ms。您可以通过其重载之一将 CancellationToken 传递给 Delay 方法。我没有看到您需要跟踪完成与取消概念的原因。不管怎样,您只是希望任务结束。

我认为您需要做的是启动一个任务,为其提供取消令牌并执行任务的等待 'outside'。也就是说,您的 PeriodicallyCheckSomething() 方法可以从其他地方重新标记为异步和 Task.Run 。然后其他地方可以执行等待等。只是我的 2c。 祝你好运

我所做的是使 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);
}