【发布时间】:2017-04-28 19:40:51
【问题描述】:
我正在尝试像这样组合我的 PLINQ 语句:
Enumerable.Range(0, _sortedList.Count()).AsParallel().WithDegreeOfParallelism(10)
.Select(i => GetTransactionDetails(_sortedList[i].TransactionID))
.ToList();
使用这样的异步方法:
private async void GetTransactionDetails(string _trID)
{
await Task.Run(() =>
{
});
}
这样我就可以在这里简单地添加一个等待操作符:
Enumerable.Range(0, _sortedList.Count()).AsParallel().WithDegreeOfParallelism(10)
.Select(i => await GetTransactionDetails(_sortedList[i].TransactionID))
.ToList();
我怎样才能做到这一点?
附:这样我可以同时发出 5-10 个 HTTP 请求,同时确保最终用户在这样做时不会感觉到任何“屏幕”冻结...
【问题讨论】:
-
你为什么要尝试并行化异步操作的启动,因为启动它基本上需要零时间。 PLINQ 用于长时间运行的 CPU 绑定操作;那不是你所拥有的。此外,看起来
GetTransactionDetails正在使用异步上同步反模式。它不应该将工作卸载到另一个线程,而应该只是一个同步方法。如果调用者想用Task.Run调用它,他们可以,如果他们想做其他事情,比如使用 PLINQ,那么他们可以这样做。 -
@Servy 你能告诉我如何在一个更实际的例子中实现你刚才所说的吗?
-
从
GetTransactionDetails中删除Task.Run,让它同步工作,从而允许PLINQ 并行化它。 -
哦,那样......我真的不能这样做,因为我在 10-15 分钟内向 PayPal 发出了大约 800 个请求,而这样做时,应用程序完全冻结了.. :/在执行 PLINQ 语句时有什么方法可以避免应用程序冻结?
-
如果正在做的工作实际上是网络请求,那么你根本不应该使用
Task.Run,请求本质上应该是Task返回,根本没有理由使用 PLINQ,由于您没有想要同步执行的 CPU 操作,您应该简单地await您拥有的网络请求。
标签: c# winforms asynchronous c#-4.0 plinq