【发布时间】:2014-04-09 22:35:51
【问题描述】:
通常并行处理仅与 CPU 密集型操作相关。但是,PLINQ 使用 WithDegreeOfParallelism 扩展专门提供 IO 密集型支持。例如:
from site in new[]
{
"www.albahari.com",
"www.linqpad.net",
"www.oreilly.com",
"www.takeonit.com",
"stackoverflow.com",
"www.rebeccarey.com"
}
.AsParallel().WithDegreeOfParallelism(6)
let p = new Ping().Send (site)
select new
{
site,
Result = p.Status,
Time = p.RoundtripTime
}
但是如果supporting IO is the goal of WithDegreeOfParallelism,那么PLINQ如何进一步扩展或使用来实现IO操作典型的“重试”效果?那么“延迟”效应呢?
例如,如果通过 WCF 服务调用的 IO 引发 CommunicationException,我可能希望在继续下一个资源之前使用“3 次尝试”策略再次发出相同的请求。我可能还想在每次尝试之间等待一分钟。虽然我在每次尝试之间“等待”一分钟,但我不希望线程阻塞等待。
在这个MSDN article 中,作者从一个类似于我上面显示的查询开始。然后他转换查询,以便没有线程阻塞。不幸的是,他在此过程中失去了 WithDegreeOfParallelism。而且无论哪种方式,他都没有解决发生错误时“重试”的问题。
有人知道或知道这样做的巧妙方法吗?
我正在考虑制作一个特殊的 IEnumerable 包装器,它允许在 PLINQ 遍历集合时“重新插入”值。这确实会导致“重试”行为,但仍然不允许“重试之间的 1 分钟延迟”要求。我可以使用 Thread.Sleep() 创建 1 分钟的延迟,但我尽量不阻塞线程。
想法?
【问题讨论】:
标签: c# multithreading error-handling io plinq