在任务完成之前,取消异步方法不起作用



我有一个异步方法。我无法访问frame.execute()代码方法。

问题:直到帧完成执行后,mytask才会取消。

当请求取消时,我需要立即取消frame.execute()和mytask。

private async Task myTask(CancellationToken tkn)
{
tkn.ThrowIfCancellationRequested();
var myList=  await Task.Run(()=> Frame.Execute(),tkn);
//Do other things
}

您收到的取消token作为输入参数通常意味着令牌是由外部代码控制的。因此,您制作的代码片段公开了以下假设:

  1. 外部代码创建了一个任务,而您的第一行(ThrowCancellationRequested)绝对合法 - 如果令牌处于"取消"状态,您的代码将在此处停止任务。
  2. 如果到目前为止还没有取消,您的任务将运行一个新任务(子任务),该任务(子任务)与输入参数相同,这绝对是合法的 - 因此,一旦发出信号,令牌可以终止这两个任务的整个子树。

@pmcilreavy评论提到的唯一错误的事情是子任务代码也应检查令牌状态。否则,这里没有取消,对不起。

P.S。您可能会发现此MSDN链接有用:https://learn.microsoft.com/en-us/dotnet/standard/parallelal-programming/how-to-cancel-a-a-task-task-and-ist-children

frame.ecute似乎与您所看到的那样,似乎不是异步。您正在做的是在新任务中启动同步过程。您通过的取消令牌仅与您创建的任务有关,但是帧。执行方法不会传递取消令牌,并且不会关注它。它很可能没有过多接受一个,因为它似乎不是异步。因此,一旦帧开始,直到在此时完成任务后就不会返回,然后将其引起关注,然后注意您取消的令牌

嗨,请尝试此写入throwifCancellationRequested to to frame.execute()代码方法,并且不要在taks呼叫中发送取消令牌可以使用cancellationTokenSource.cancel()的呼叫myTask,查看下一个示例代码。

using System;
using System.Threading;
using System.Threading.Tasks;
CancellationTokenSource cancellationTokenSource =
new CancellationTokenSource();
CancellationToken tkn = cancellationTokenSource.Token;
private async Task myTask(CancellationToken tkn)
{
    Console.WriteLine("Hi now i'm inside the Task");    
    var IsOut =  await Task.Run(()=> {
        while(true)
                {
                    Console.Write("*");
                    Thread.Sleep(500);
                }
        return true;
        });
    tkn.ThrowIfCancellationRequested();
    Console.WriteLine("This code not execute");
//Do other things
}
Console.WriteLine("Before to invoke the Taks");
Task.Run(()=> myTask(tkn));
Thread.Sleep(3000);
cancellationTokenSource.Cancel();
Console.WriteLine("");
Console.WriteLine("The End ");

最新更新