如何取消等待阻塞呼叫的任务

时间:2018-12-11 10:27:01

标签: c# multithreading uwp

我是C#中UWP应用程序的初学者。我需要取消正在进行的阻塞呼叫时的任务。请参阅下面的代码片段以更好地理解。

TimeSpan timeSpan = TimeSpan.FromMilliseconds(10000);
CancellationToken token = new CancellationTokenSource(timeSpan).Token;

    await Task.Run(() =>
                   {
                     //This is a blocking call
                     Task.Delay(11002).Wait();
                   }, token);

据我所知,如果我像Task.Delay(11002).Wait(token);那样执行阻塞调用,则延迟任务将被取消,但我的要求是取消父任务。因为我要在任务中写一个同步套接字。

希望我的问题对每个人都是可以理解的。 谢谢

1 个答案:

答案 0 :(得分:0)

我建议在您将要使用的方法之外创建取消令牌源,并将其传递给Neil在他的评论中提到。

下面是一个示例,显示了如何执行此操作以及如何取消它。

private async Task ParentAsync()
{
    TimeSpan timeSpan = TimeSpan.FromMilliseconds(10000);
    CancellationTokenSource cts = new CancellationTokenSource(timeSpan);

    await ExecuteAsync(cts);

    cts.Cancel(); // This will cause the execution to cancel.
}

private async Task ExecuteAsync(CancellationTokenSource cts)
{
    await Task.Run(() =>
                {
                    //This is a blocking call
                    Task.Delay(11002).Wait();
                }, cts.Token);
}

如果您希望取消执行父方法,则可以使用令牌处理取消任务的方式执行与子方法相同的步骤。

希望这会有所帮助!