在 .Net 4.0 中使用穷人的 async/await 结构实现异步超时

2023-11-23

动机

C# 5.0 async/await 构造非常棒,但不幸的是,Microsoft 仅展示了 .NET 4.5 和 VS 2012 的候选版本,这些技术在我们的项目中得到广泛采用还需要一些时间。

在史蒂芬·图布的书中异步方法、C# 迭代器和任务我找到了一个可以很好地在 .NET 4.0 中使用的替代品。还有十几个其他实现,即使在 .NET 2.0 中也可以使用该方法,尽管它们看起来有点过时且功能不太丰富。

Example

现在我的 .NET 4.0 代码如下所示(注释部分显示了它在 .NET 4.5 中的实现方式):

//private async Task ProcessMessageAsync()
private IEnumerable<Task> ProcessMessageAsync()
{
    //var udpReceiveResult = await udpClient.ReceiveAsync();

    var task = Task<UdpAsyncReceiveResult>
               .Factory
               .FromAsync(udpClient.BeginReceive, udpClient.EndReceive, null);

    yield return task;

    var udpReceiveResult = task.Result;

    //... blah blah blah

    if (message is BootstrapRequest)
    {
        var typedMessage = ((BootstrapRequest)(message));

        // !!! .NET 4.0 has no overload for CancellationTokenSource that 
        // !!! takes timeout parameter :(
        var cts 
          = new CancellationTokenSource(BootstrapResponseTimeout); // Error here

        //... blah blah blah

        // Say(messageIPEndPoint, responseMessage, cts.Token);

        Task.Factory.Iterate(Say(messageIPEndPoint, responseMessage, cts.Token));
    }
}

虽然它能完成工作,但看起来有点难看

问题

使用时取消令牌源在.NET 4.5中,有一个构造函数将时间跨度作为超时参数,因此结果CancellationTokenSource在指定时间内取消。
.Net 4.0 无法超时,那么在 .Net 4.0 中执行此操作的正确方法是什么?


FWIW,您可以在4.0项目中使用async/await,只需使用异步定位包。非常适合我!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 .Net 4.0 中使用穷人的 async/await 结构实现异步超时 的相关文章

随机推荐