我在基于客户端/服务器的应用程序上写作;客户端可以请求服务器运行某些计算。 服务器将在后台线程上启动计算,并在计算时每1秒发送一次心跳消息。
在最近的网络版本中,这相当容易:
var calculationTask = Task.Run(() => DoTheCalculation());
while(true)
{
Task heartbeatTask = Task.Delay(1000); // We send a heartbeat every second
Task combinedTask = Task.WhenAny(calculationTask, heartbeatTask);
combinedTask.Wait();
if(calculationTask.IsFaulted || calculationTask.IsCompleted)
{
SendResultToClient();
break;
}
SendHeartbeatToClient();
}
但我希望现在在Net 4.0中实现相同的模式。 Task.Run()和Task.Delay()相对容易伪造;但似乎并不是Task.WhenAny()的简单实现。
有任何其他方式伪造这种行为的聪明人吗?我已经想到了一些其他形式的信令(ManualResetEventSlim),但到目前为止还无法想到任何方法来证明这种子弹。
我正在寻找一种不需要任何其他库的解决方案(例如没有TPL等)。
谢谢!
答案 0 :(得分:3)
.NET 4.0中最好的选择是TaskFactory.ContinueWhenAny
。
您通常使用以下方式调用此方法:
Task.Factory.ContinueWhenAny(yourArrayOfTasks, yourActionWhenAnyHere);