我有一个函数可以做几秒钟的工作。我试图在一段时间后取消这项任务,但我无法这样做。我的目标是做5秒的asyncFunction,然后转到另一个任务。出于某种原因,我似乎不能等待_t1。
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);
});
}我打电话给我的乐趣是:
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。任何代码帮助都是非常感谢的。
发布于 2022-04-21 20:03:33
我不太明白代码的目的。特别是如果-声明:
if (await Task.WhenAny(_t1, Task.Delay(_timeout, timeoutCancellationTokenSource.Token)) == _t1)为什么要将一个_timeout传递给Task.Delay,这与您创建timeoutCancellationTokenSource的超时时间相同?
如果我们忽略给Task.Delay的第一个参数,这也意味着您有两个调用Task.Delay的相同CancellationToken,现在您有一个种族条件,无法预测哪个Task.Delay会首先被取消。
要演示如何使取消操作工作的示例,您可以这样做:
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比传递给asyncFunction的2000毫秒长,则任务在2秒后完成,而不被取消。
有关测试运行,请参见这把小提琴。
https://stackoverflow.com/questions/71959336
复制相似问题