具有2个任务的Task.WhenAny()的Net 4.0替代方案?

时间:2018-03-23 10:04:20

标签: c# asynchronous task

我在基于客户端/服务器的应用程序上写作;客户端可以请求服务器运行某些计算。 服务器将在后台线程上启动计算,并在计算时每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等)。

谢谢!

1 个答案:

答案 0 :(得分:3)

.NET 4.0中最好的选择是TaskFactory.ContinueWhenAny

您通常使用以下方式调用此方法:

Task.Factory.ContinueWhenAny(yourArrayOfTasks, yourActionWhenAnyHere);