[英]task IsCanceled is false, while I canceled
當我取消任務時,等待結果仍然為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}”。 為什么狀態未取消或某事?
像這樣:
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));
}
我只在調試模式下遇到一些錯誤,似乎myTaskToWaitFor實際上被取消了,但代碼沒有繼續(繼續程序由於異常而關閉)。 有什么想法嗎? 親切的問候,
Matthijs
編輯:
使用TrowIfCancellationRequested進行測試是基於“ 當你在CancellationToken上調用ThrowIfCancellationRequested時會被取消,它會拋出一個OperationCanceledException。任務並行庫知道這種類型的異常代表取消而不是失敗,並且會以不同的方式對待它。例如,Task有一個名為IsCanceled的屬性,當執行異步方法時拋出OperationCanceledException時自動變為true。 “來自Alex Davies的C#5.0中的Async一書。
這就是為什么我認為我可以期望myTaskToWaitFor.IsCancelled返回true並且代碼將繼續。
ThrowIfCancellationRequested()
是發出由於觀察取消而存在的信號的理想方式。 這將在調用者處將其自身表示為異常,但您可以通過在await
周圍進行try
/ catch
,並簡單地檢查其中的原因來處理 - 無論是在任務上還是通過檢查AggregateException
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.