【发布时间】:2015-10-02 01:42:37
【问题描述】:
我在处理异步/等待时遇到了一些麻烦。我正在帮助具有以下代码的现有代码库(为简洁起见进行了简化):
List<BuyerContext> buyerContexts = GetBuyers();
var results = new List<Result>();
Parallel.ForEach(buyerContexts, buyerContext =>
{
//The following call creates a connection to a remote web server that
//can take up to 15 seconds to respond
var result = Bid(buyerContext);
if (result != null)
results.Add(result);
}
foreach (var result in results)
{
// do some work here that is predicated on the
// Parallel.ForEach having completed all of its calls
}
如何使用 async/await 将此代码转换为异步代码而不是并行代码?我遇到了一些非常严重的性能问题,我认为这是对多个网络 I/O 操作使用并行方法的结果。
我自己尝试了几种方法,但我从 Visual Studio 收到警告说我的代码将同步执行,或者我不能在异步方法之外使用 await 关键字,所以我确定我只是错过了一些东西很简单。
编辑#1:我也愿意接受 async/await 的替代方案。根据我目前的阅读,这似乎是正确的方法。
编辑#2:此应用程序是 Windows 服务。它呼吁几个“买家”要求他们对特定的数据进行投标。在继续处理之前,我需要返回所有出价。
【问题讨论】:
-
可以添加Bid方法定义吗?如果它与网络相关,那么查看网络代码真的很有帮助:)
-
听起来像是一个非常昂贵的循环调用。您需要预先获得所有结果吗?你能不能得到一些结果,然后只在用户要求更多时才返回?
-
查看stackoverflow.com/questions/9290498/… 以获得简单的解决方案。
-
Bid 方法有大量的逻辑,建立网络连接的实际代码隐藏在一个抽象基类中几个层次。在这里发布所有内容是不谨慎的。
-
在我看来,
async更有可能是这里的解决方案。Parallel.ForEach只是在并行调用,网络接口是造成这里变慢的罪魁祸首
标签: c# asynchronous