c# - 在 .Net 4.0 中使用 poor mans async/await 构造实现异步超时

标签 c# timeout pattern-matching task-parallel-library async-await

动机

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

在 Stephen Toub 的 Asynchronous methods, C# iterators, and Tasks我找到了一个可以在 .NET 4.0 中很好地使用的替代品。还有许多其他实现使得即使在 .NET 2.0 中也可以使用该方法,尽管它们看起来有点过时且功能不那么丰富。

例子

现在我的 .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));
    }
}

看起来有点丑,但它能完成工作

问题

使用 CancellationTokenSource 时在 .NET 4.5 中有一个构造函数将时间跨度作为超时参数,因此生成的 CancellationTokenSource 在指定的时间段内取消。
.Net 4.0 无法超时,那么在 .Net 4.0 中正确的做法是什么?

最佳答案

FWIW,您可以在 4.0 项目中使用 async/await,只需使用 the async targeting pack .对我来说很棒!

关于c# - 在 .Net 4.0 中使用 poor mans async/await 构造实现异步超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11300900/

相关文章:

c# - 如何在 C# 中像 Visual Basic 一样使用 Lib

c# - 升级到 ASP.NET Core 2.0 后无法创建迁移

bash - 在 bash 中的 while 循环中添加超时命令时出错

regex - 两个逗号分隔的字符串之间的 R 匹配

java - 将许多文件与 Java 中的许多模式匹配

c# - 你能制作一个 C# 程序,它不能访问除安装文件夹以外的任何本地文件系统吗?

c# - 正则表达式 - 在特定情况下替换 C# 字符串中的字符

timeout - Chromecast 如何确定不活动状态?

asp.net - 调试请求超时 (System.Web.HttpException)

haskell - Haskell中基于位置的元组模式匹配