Ekn*_*oes 1 .net c# task-parallel-library
我正在使用parse.com进行身份验证.当用户通过身份验证时,我想从解析中加载一些数据,但这只应在身份验证成功时进行.我尝试用a取消任务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();
})
Run Code Online (Sandbox Code Playgroud)
可以取消这样的任务吗?或者我做错了什么?
首先,您应该考虑使用async-await而不是ContinueWith.你的代码会简单得多:
await ParseUser.LogInAsync(username, password);
await LoadDataAsync();
LoginSuccessful();
Run Code Online (Sandbox Code Playgroud)
.net中的取消是合作的,因此有人取消令牌(通常在任务之外),并且任务内部的代码需要观察令牌.您的代码不会观察令牌,因此只有在任务开始执行之前取消该任务时才能取消该任务(当任务取消时不会出现这种情况).
如果要求取消,您需要观察令牌并抛出:
if (t.IsFaulted || t.IsCanceled)
{
// Login failed
cts.Cancel();
cts.Token.ThrowIfCancellationRequested();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
662 次 |
| 最近记录: |