我似乎無法圍繞如何正確啓動任務並取消它。我已經改變了我的代碼,使其更易於理解我的問題並將其粘貼到下面(我還添加了一些評論)。首先調用SubscribeToReport
方法 - 它包含一個await runReportTask
,根據我的理解,它只會啓動runReportTask
方法,等待它完成執行,然後繼續執行出現在await
之後的代碼。如何正確啓動和取消任務。
Inside runReportTask
我創建了一個CancellationTokenSource並使用Task.Factory.StartNew()
開始一個新的任務。在任務內部,只要任務沒有被取消,就有一個while循環執行處理。根據我的理解,如果cancellationToken.IsCancellationRequested
是真的,我的while循環中的其他內容將運行,任務將停止。之後,我期待SubscribeToReport()
繼續執行 - 這種情況不會發生,並且在StopReportTask()
中撥打cancellationTokenSource.Cancel()
時,我的代碼似乎不會執行任何操作。我究竟做錯了什麼?我一直在這裏呆了一段時間,我似乎無法圍繞這應該如何工作。
private async static void SubscribeToReport()
{
Console.WriteLine("Waiting for task to finish or cancel...");
await runReportTask();
Console.WriteLine("Task has finished or was canceled."); // THIS LINE NEVER EXECUTES
}
private static CancellationTokenSource cancellationTokenSource;
private static CancellationToken cancellationToken;
private bool moreToDo = true;
private static Task runReportTask()
{
cancellationTokenSource = new CancellationTokenSource();
cancellationToken = cancellationTokenSource.Token;
return Task.Factory.StartNew(() =>
{
// Were we already canceled?
cancellationToken.ThrowIfCancellationRequested();
while(moreToDo == true)
{
if(!cancellationToken.IsCancellationRequested)
{
// Do important code here
}
else{
Console.WriteLine("Task canceled."); // THIS LINE NEVER EXECUTES WHEN CALLING StopReportTask() below
cancellationToken.ThrowIfCancellationRequested();
break;
}
}
}, cancellationToken);
}
// This method is called from another source file
private void StopReportTask()
{
Console.WriteLine("Stopping report task...");
cancellationTokenSource.Cancel();
}
你能否確認在同一個對象上調用'cancellationTokenSource.Cancel()'? – CodingYoshi
包含此代碼的類是單例,所以是的。 – Roka545
我開始認爲這可能是一個與我正在使用的nanomsg方法有關的問題。我正在使用nanomsg通過發佈者/訂閱者系統接收數據 - 在我的while循環中,我有一個偵聽消息的方法 - 它等待,直到它接收到一個 - 在這段時間內,我不認爲while循環繼續運行,解釋爲什麼取消令牌不起作用。我已經調試了我的StopReportTask方法,並且取消標記肯定會返回true(因爲它要取消該任務)。 – Roka545