首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#:异步任务:取消

C#:异步任务:取消
EN

Stack Overflow用户
提问于 2022-04-21 18:33:27
回答 1查看 198关注 0票数 0

我有一个函数可以做几秒钟的工作。我试图在一段时间后取消这项任务,但我无法这样做。我的目标是做5秒的asyncFunction,然后转到另一个任务。出于某种原因,我似乎不能等待_t1。

代码语言:javascript
复制
private async Task asyncFunction(string line_1, string line_2, string line_3, string line_4, int _time, System.Threading.CancellationTokenSource _cts)
    {
        _cts.Token.ThrowIfCancellationRequested();

        await Task.Run(async () => {
            someFunction_01(line_1, line_2, line_3, line_4);                
            someFunction_01("HELLO WORLD");
            await Task.Delay(_time, _cts.Token);
        });
    }

我打电话给我的乐趣是:

代码语言:javascript
复制
TimeSpan _timeout = TimeSpan.FromSeconds(5);
            var timeoutCancellationTokenSource = new System.Threading.CancellationTokenSource(_timeout);
            
            Task _t1 = asyncFunction("LINE 01", " ", " ", " ", 6000, timeoutCancellationTokenSource);
if (await Task.WhenAny(_t1, Task.Delay(_timeout, timeoutCancellationTokenSource.Token)) == _t1)
            {                    
                await _t1;
            }
            else
            {
                // timeout/cancellation logic                    
                timeoutCancellationTokenSource.Cancel();
            }

我似乎不能取消Task.Delay中的asyncFunction。任何代码帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-21 20:03:33

我不太明白代码的目的。特别是如果-声明:

代码语言:javascript
复制
if (await Task.WhenAny(_t1, Task.Delay(_timeout, timeoutCancellationTokenSource.Token)) == _t1)

为什么要将一个_timeout传递给Task.Delay,这与您创建timeoutCancellationTokenSource的超时时间相同?

如果我们忽略给Task.Delay的第一个参数,这也意味着您有两个调用Task.Delay的相同CancellationToken,现在您有一个种族条件,无法预测哪个Task.Delay会首先被取消。

要演示如何使取消操作工作的示例,您可以这样做:

代码语言:javascript
复制
TimeSpan _timeout = TimeSpan.FromSeconds(1);
var timeoutCancellationTokenSource = new System.Threading.CancellationTokenSource(_timeout);

Task _t1 = asyncFunction("LINE 01", " ", " ", " ", 2000, timeoutCancellationTokenSource);
try
{
    await _t1;
}
catch (OperationCanceledException)
{
    Console.WriteLine("Operation was cancelled");
}

// Output: Operation was cancelled

如果_timeout比传递给asyncFunction2000毫秒长,则任务在2秒后完成,而不被取消。

有关测试运行,请参见这把小提琴

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71959336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档