栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何限制并发异步I / O操作的数量?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何限制并发异步I / O操作的数量?

您绝对可以使用.NET 4.5 Beta在最新版的.NET异步中执行此操作。上一则来自’usr’的文章指出了Stephen
Toub撰写的一篇不错的文章,但鲜为人知的消息是异步信号量实际上已将其纳入.NET 4.5 Beta版中

如果您看一下我们钟爱的

SemaphoreSlim
类(您应该使用它,因为它比原始类性能更好
Semaphore
),它现在拥有
WaitAsync(...)
一系列重载,带有所有预期的参数-超时间隔,取消令牌,所有您通常的计划朋友: )

Stephen’s还撰写了一篇有关Beta版发布的新.NET 4.5优点的最新博客文章,请参见.NET 4.5
Beta中的并行性新功能

最后,这是一些有关如何使用SemaphoreSlim进行异步方法限制的示例代码:

public async Task MyOuterMethod(){    // let's say there is a list of 1000+ URLs    var urls = { "http://google.com", "http://yahoo.com", ... };    // now let's send HTTP requests to each of these URLs in parallel    var allTasks = new List<Task>();    var throttler = new SemaphoreSlim(initialCount: 20);    foreach (var url in urls)    {        // do an async wait until we can schedule again        await throttler.WaitAsync();        // using Task.Run(...) to run the lambda in its own parallel        // flow on the threadpool        allTasks.Add( Task.Run(async () => {     try     {         var client = new HttpClient();         var html = await client.GetStringAsync(url);     }     finally     {         throttler.Release();     } }));    }    // won't get here until all urls have been put into tasks    await Task.WhenAll(allTasks);    // won't get here until all tasks have completed in some way    // (either success or exception)}

最后,但值得一提的是使用基于TPL的计划的解决方案。您可以在TPL上创建尚未启动的委托绑定任务,并允许自定义任务计划程序限制并发性。实际上,这里有一个MSDN示例:

另请参阅TaskScheduler。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/596984.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号