代码之家  ›  专栏  ›  技术社区  ›  DuckQueen

如何允许异步任务运行给定的秒数?

  •  -1
  • DuckQueen  · 技术社区  · 3 年前

    所以我创建了一个任务处理程序。我想让它运行一段预定的有保证的时间,然后我想做一些我的事情,只有到那时我才需要等待处理程序的结果。类似于:

    var th = TaskCreator();
    th.awaitFor(5000);
    //do some work
    var result = await th;
    

    那么,异步任务如何在给定的秒数内运行呢?

    1 回复  |  直到 3 年前
        1
  •  5
  •   ProgrammingLlama Raveena Sarda    3 年前

    你可以使用 WhenAny ( docs )以下为:

    var th = TaskCreator();
    await Task.WhenAny(Task.Delay(TimeSpan.FromSeconds(5)), th);
    //do some work
    var result = await th;
    

    当其中一项任务完成时,这将停止等待,这意味着你可以完成其他工作,然后重新等待 th 在最后等待它的完成(或者如果它已经完成,就只得到结果)。

    如果你 TaskCreator 方法在异步之前做了大量同步工作,您可能需要首先调用 await Task.Yield(); ( docs )内部 任务生成器 方法,然后再使用上面的代码。

        2
  •  1
  •   Marc Gravell    3 年前

    这里的首选机制是在您的 TaskCreator 。这提供了多种好处:

    • 它允许在 任务生成器 实际上停止了 超时发生时
    • 它允许灵活处理未来的取消原因

    示例:

    using var cs = new CancellationTokenSource();
    cs.CancelAfter(TimeSpan.FromSeconds(5));
    var result = await TaskCreator(cs.Token);
    

    你的 任务生成器 大概看起来像:

    async Task<int> TaskCreator(CancellationToken cancellationToken)
    

    以及你在哪里 实际使用 cancellationToken 在里面 任务生成器 ,直接(通常通过 .ThrowIfCancellationRequested() .Register(...) )或者间接地(将其传递给下游可获得的API)。