【问题标题】:Timing out a task using await in .NET 4.5在 .NET 4.5 中使用 await 使任务超时
【发布时间】:2012-09-07 11:26:29
【问题描述】:

我正在 VB.NET 4.5 中尝试 Async / Await 并希望完成我的任务 如果在一定时间内未完成,则超时。我有

Await Task.Run( Sub() PerformSomeAction() )

这看起来很整洁。我还看到有一种带有取消令牌的 Task.Run 形式。如果超时,我如何使用它来取消任务?

编辑

我有以下原型解决方案

    Dim cts = New CancellationTokenSource()
    Dim ct As CancellationToken = cts.Token
    Dim delay = Task.Delay(1000)
    Dim completed = Await Task.WhenAny(Task.Run(Sub() PerfomSomeAction(ct), ct), delay)
    If completed Is delay Then
            cts.Cancel()
    End If

这看起来很嘈杂的代码。这个好吗?另一个想法是处理 超时作为例外并使用 cts.CancelAfter。像这样??

    Dim cts = New CancellationTokenSource()
    Dim ct As CancellationToken = cts.Token
    try
        cts.CancelAfter(1000) 'ms
        Dim completed = Task.Run(Sub() PerformSomeAction(ct), ct)
    catch SomeTimeoutException
    end try

如果我得到了 PerformSomeAction,我会抛出 SomeTimeoutException 检测取消令牌。

【问题讨论】:

  • 你应该使用CancelAfter方法除了ThrowIfCancellationRequested作为svick回答。

标签: vb.net timeout task-parallel-library async-await


【解决方案1】:

Tasks 支持协同取消,这意味着如果你想取消已经运行的TaskTask 中的代码必须支持取消,它决定何时取消。实现这一点的方法是将取消令牌传递给该方法,并在该方法代码中的适当位置调用ThrowIfCancellationRequested()

如果Task 中的代码不支持取消,则没有明确的方法可以取消或中止它。

【讨论】:

  • 以及如何在延续代码中巧妙地检测到发生超时或发生了正确的行为。我给出了两个示例,超时异常或检查结果。是否有一种常用的模式来保持代码流的整洁?
  • 是的,如果你正确地取消了Task,然后await,它会抛出TaskCancelledException
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 2015-06-21
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
相关资源
最近更新 更多