【问题标题】:Timeouting a Task - but the logic continues [duplicate]超时任务-但逻辑继续[重复]
【发布时间】:2018-06-06 11:00:54
【问题描述】:

如果我有例如以下代码:

Task task = Task.Factory.StartNew(() =>
{
    work1();
    work2();
    work3();
    work4();
    ...
}, token);

if (!task.Wait(10 * 1000))
{
    ...timeout
}

是否有可能完成一个行为,如果我超时,超时任务中的逻辑也会被取消?例如:如果work1 花了 11 秒然后完成,我想确保之后的所有工作都不会执行。

【问题讨论】:

  • 你可以这样做,token.Cancel(); 如果这是你的要求
  • 一定是骗子。
  • 你应该避免使用Task.Factory.StartNew,而是使用Task.Run

标签: c# task


【解决方案1】:

您可以在每个方法调用之前插入ThrowIfCancellationRequested()

Task task = Task.Factory.StartNew(() =>
{
    token.ThrowIfCancellationRequested();
    work1();

    token.ThrowIfCancellationRequested();
    work2();

    token.ThrowIfCancellationRequested();
    work3();

    token.ThrowIfCancellationRequested();
    work4();
    ...
}, token);

if (!task.Wait(TimeSpan.FromSeconds(10))
{
    tokenSource.Cancel();
    // handle cancel case
} else {
    // handle done case
}

这样,如果这项工作没有在 10 秒内完成,您将停止执行任务中的代码。

【讨论】:

    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2014-02-04
    • 2020-10-12
    相关资源
    最近更新 更多