Task中的代码如何知道它已超时?



考虑以下代码:

public class EventManager
{
  public Task<string> GetResponseAsync(string request)
  {
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    return new Task<string>( () =>
    {
      // send the request
      this.Send(request);
      // wait for the response until I've been cancelled or I timed out.
      // this is important because I want to cancel my "wait" if either occur
      // WHAT CODE CAN I WRITE HERE TO SEE IF THIS TASK HAS TIMED OUT?
      // (see the example below)
      // 
      // Note that I'm not talking about cancellation
      // (tokenSource.Token.IsCancellationRequested)
      return response;
    }, tokenSource.Token);
  }
}

public static void Main()
{
  EventManager mgr = new EventManager();
  Task<string> responseTask = mgr.GetResponseAsync("ping");
  responseTask.Start();
  if (responseTask.Wait(2000))
  {
    Console.WriteLine("Got response: " + responseTask.Result);
  }
  else
  {
    Console.WriteLine("Didn't get a response in time");
  }
}

任务不包含开箱即用的超时功能。你可以通过启动一个Timer来添加它,如果任务还没有完成,它会在超时后取消任务。

Joe Hoad在Parallel FX Team博客上提供了一个实现,它做到了这一点,并涵盖了几个容易被忽视的边缘情况。

在这种情况下,您不会。

如果你想要能够杀死一个没有及时返回的任务,你需要将你的取消令牌传递给异步调用(而不是在该方法中创建它),这样你就可以从调用者(在这种情况下是Main)发出信号来取消它。

您无法知道Task是否超时,因为在本示例中它实际上从未超时。Wait API将在Task完成或指定时间流逝时阻塞。如果时间流逝,Task本身没有发生任何变化,则Wait的调用者返回false。Task继续不变运行

如果你想与Task沟通,你不再对它的结果感兴趣,最好的方法是使用取消。

相关内容

  • 没有找到相关文章