我似乎无法围绕如何正确启动任务并取消它。我已经改变了我的代码,使其更易于理解我的问题并将其粘贴到下面(我还添加了一些评论)。首先调用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