簡體   English   中英

任務IsCanceled是假的,而我取消了

[英]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}”。 為什么狀態未取消或某事?

當我使用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));
}

我只在調試模式下遇到一些錯誤,似乎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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM