从任务内部取消任务

本文关键字:任务 取消 内部 | 更新日期: 2023-09-27 18:22:05

我正在使用parse.com进行身份验证。当用户通过身份验证时,我想从解析中加载一些数据,但这应该只在身份验证成功时发生。我尝试用CancellationToken取消该任务,但它不起作用。以下是示例代码:

CancellationTokenSource cts = new CancellationTokenSource();
ParseUser.LogInAsync(username, password).ContinueWith(t =>
{
    if (t.IsFaulted || t.IsCanceled)
    {
        // Login failed
        cts.Cancel();
    }
    return t;
}, cts.Token).Unwrap().ContinueWith(t =>
{
    return LoadDataAsync();
}).Unwrap().ContinueWith(t =>
{
    LoginSuccessful();
})

可以这样取消任务吗?或者我做错了什么?

从任务内部取消任务

首先,您应该考虑使用异步等待而不是ContinueWith。你的代码会简单得多:

await ParseUser.LogInAsync(username, password);
await LoadDataAsync();
LoginSuccessful();

net中的取消是协作的,因此有人取消令牌(通常在任务之外),任务内部的代码需要观察令牌。您的代码不观察令牌,因此只有在任务开始执行之前取消了任务时,它才能取消任务(当任务自行取消时,情况不可能如此)。

如果请求取消,您需要观察代币并投掷:

if (t.IsFaulted || t.IsCanceled)
{
    // Login failed
    cts.Cancel();
    cts.Token.ThrowIfCancellationRequested();
}