考虑以下代码:
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
沟通,你不再对它的结果感兴趣,最好的方法是使用取消。