C# Net 4.0任务的替代方案。WhenAny()有2个任务?

C# Net 4.0任务的替代方案。WhenAny()有2个任务?,c#,asynchronous,task,C#,Asynchronous,Task,我正在基于客户机/服务器的应用程序上编写;客户端可以请求服务器运行某些计算。 服务器将在后台线程上启动计算,并在计算过程中每1秒发送一条心跳消息 在最近的网络版本中,这相当容易: var calculationTask = Task.Run(() => DoTheCalculation()); while(true) { Task heartbeatTask = Task.Delay(

我正在基于客户机/服务器的应用程序上编写;客户端可以请求服务器运行某些计算。 服务器将在后台线程上启动计算,并在计算过程中每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();
            }
但我现在希望在NET4.0中实现相同的模式。Task.Run()和Task.Delay()相对容易伪造;但是Task.WhenAny()的实现似乎并不容易

有没有聪明的人以其他方式假装这种行为?我已经想到了一些其他形式的信号(ManualResetEventSlim),但到目前为止,我真的没有想到任何方法可以让它防弹

我正在寻找一个不需要任何其他库的解决方案(例如,不需要TPL或类似的库)


谢谢

在.NET 4.0中,最好的替代方案是

您通常使用以下方法将其称为:

Task.Factory.ContinueWhenAny(yourArrayOfTasks, yourActionWhenAnyHere);

在.NET4.0中,最好的替代方法是

您通常使用以下方法将其称为:

Task.Factory.ContinueWhenAny(yourArrayOfTasks, yourActionWhenAnyHere);

为什么不传递一个CancellationToken并将其设置为1000ms过期?为什么不传递一个CancellationToken并将其设置为1000ms过期?