通常,并行处理是只与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
}
但是,如果支持IO是WithDegreeOfParallelism的目标 ,怎能PLINQ进一步扩展或使用,实现了“重试”的效果,这是典型的IO操作的? 而关于“延迟”的效果呢?
例如,如果通过IO WCF服务调用抛出一个的CommunicationException,我可能要在移动到下一个资源之前,“3次尝试”战略再次提出同样的要求。 我可能还需要一分钟的等待时间之间的每个尝试。 而我“等”一分钟之间的每一个尝试,我不想阻塞,在等待的线程。
在这个MSDN文章的作者开始用类似于我上面显示的查询。 然后,他改造查询,以便没有线程阻塞。 不幸的是,他失去了在这个过程中WithDegreeOfParallelism。 而无论哪种方式,他并没有在发生错误时解决“重试”的问题。
任何人都有或知道这样做华而不实的方式吗?
我想制作一个允许值进行“重新插入”,同时收集是由PLINQ走到一个特殊的IEnumerable包装的。 这的确会造成“重试”的行为,但它仍然不会允许要求“之间重试延迟1分钟”。 我可以创建一个Thread.sleep()方法将延迟1分钟,但我尽量不阻塞线程。
思考?