我正在使用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();
})


是否可以取消这样的任务?还是我做错了什么?

最佳答案

首先,您应该真正考虑使用async-await代替ContinueWith。您的代码会简单得多:

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


.net中的取消是协作的,因此有人取消了令牌(通常在任务外部),并且任务内部的代码需要观察令牌。您的代码没有观察到令牌,因此只有在任务开始执行之前被取消的情况下,它才可以取消任务(如果任务自行取消,情况就不会如此)。

您需要观察令牌并在请求取消时抛出:

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

10-08 02:39