作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通常并行处理仅与 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
}
最佳答案
你的文章linked实际上展示了如何通过使用 Task
来避免阻塞 IO 绑定(bind)操作的线程。 - 基于 API ( DownloadDataTask
) 代替:
However, there’s still something about this code that is not ideal. The work (sending off download requests and blocking) requires almost no CPU, but it is being done by ThreadPool threads since I’m using the default scheduler. Ideally, threads should only be used for CPU-bound work (when there’s actually work to do).
Task.Run
/
Task.Factory.StartNew
对于基于 IO 的操作是
反模式 . PLINQ(与
Parallel.For
等相同)适用于 CPU 密集型计算工作,但为自然异步网络/IO 密集型操作分配和阻塞线程是没有意义的,它根本不需要线程,而“飞行中”。按照您显示的示例代码,这将类似于
new Ping().SendAsync(site)
,返回
Task
.然后你可以做
await Task.WhenAll(tasks)
并处理错误。
关于c# - 用于错误处理的并行 I/O 和重试逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22238930/
我是一名优秀的程序员,十分优秀!