gpt4 book ai didi

c# - 任务 IsCanceled 是假的,而我取消了

转载 作者:太空狗 更新时间:2023-10-29 22:59:48 25 4
gpt4 key购买 nike

当我取消任务时,等待结果仍然为 IsCanceled 属性返回 true。似乎出了点问题。

请指教。这是代码:

CancellationTokenSource _cancelLationToken = new CancellationTokenSource();

private async void Button_Click(object sender, EventArgs e)
{
_cancelLationToken = new CancellationTokenSource();
_cancelLationToken.Token.Register(theCallBack);
var myTaskToWaitFor = Task.Factory.StartNew(() => WorkHard(_cancelLationToken.Token), _cancelLationToken.Token);
await myTaskToWaitFor;

int i=0;

if(myTaskToWaitFor.IsCanceled)
i = i; //breakpoint for debugging
else
i = i; //breakpoint for debugging <== always ends here... :-(
}

private void WorkHard(CancellationToken token)
{
for(int i = 0; i < 100000000; i++)
if(token.IsCancellationRequested)
break;
else
Math.Acos(Math.Pow(i, i / 10000000));
}

public void theCallBack()
{
//todo: do something
}

private void CancelButton_Click(object sender, EventArgs e)
{
_cancelLationToken.Cancel();
}

当我点击 CancelButton 并因此触发 CancelButton_Click 方法时,将触发 CallBack 方法。但是...当我检查 myTaskToWaitFor.IsCanceled 总是返回 false 时,我得到以下信息:Id = 1,Status = RanToCompletion,Method =“{null}”。为什么状态不是 Cancelled 之类的?

当我使用 http://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.throwifcancellationrequested.aspx

像这样:

private void WorkHard(CancellationToken token)
{
for(int i = 0; i < 100000000; i++)
if(token.IsCancellationRequested)
token.ThrowIfCancellationRequested();
else
Math.Acos(Math.Pow(i, i / 10000000));
}

我只在 Debug模式下遇到一些错误,而且 myTaskToWaitFor 似乎实际上已取消,但代码不会继续(在继续时程序因异常而关闭)。有什么想法吗?亲切的问候,

马蒂斯

编辑:

使用 TrowIfCancellationRequested 进行的测试基于“当您在已取消的 CancellationToken 上调用 ThrowIfCancellationRequested 时,它将抛出 OperationCanceledException。任务并行库知道这种类型的异常代表取消而不是失败,并将处理它不同。例如,Task 有一个名为 IsCanceled 的属性,它会自动在执行异步操作时抛出 OperationCanceledException 时变为真方法。”来自 Alex Davies 的 Async in C# 5.0 一书。

这就是为什么我认为我可以期望 myTaskToWaitFor.IsCancelled 返回 true 并且代码将继续。

最佳答案

ThrowIfCancellationRequested() 是发出信号表明您由于观察到取消而存在的理想方式。这在调用者处显示为异常,但您可以通过围绕await< 的try/catch 来处理它,并简单地检查那里的原因 - 无论是在任务上,还是通过检查 AggregateException

关于c# - 任务 IsCanceled 是假的,而我取消了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18738008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com