asynchronous - 这个线程代码有解释吗?
问题描述
所以遇到了一些与此非常相似的代码。我只是想知道是否有人可以向我解释这一点。
看看它如何使用 RX 调度程序,然后是 Parallel.For 和里面一个新的 TaskFactory.StartNew
IDisposable subscription = someObservable.ObserveOn(ThreadPoolScheduler.Instance)
.Subscribe(o =>
{
Parallel.ForEach(xxxs,
x =>
{
var theKey = x.Key;
if (!theTasks.ContainsKey(theKey) ||
theTasks.ContainsKey(theKey) && theTasks[theKey].IsCompleted)
{
theTasks[theKey] = Task.Factory.StartNew(
() =>
{
.....
}
catch (CommunicationObjectAbortedException ex)
{
....
}
catch (ObjectDisposedException ex)
{
....
}
catch (Exception e)
{
....
}
});
}
});
},
ex =>
{
....
},
() =>
{
....
});
}
我知道所有这些事情单独做了什么,但我不确定这里的组合线程效果是什么。任何人都可以猜测
解决方案
啊,是的,并发Turducken。
ThreadPoolScheduler
调度与任务池不同的线程池上的工作。用于在没有任务池的平台上使用 -尽可能选择。ThreadPoolScheduler
TaskPoolScheduler
感觉就像作者试图通过使用线程池来仅为手头的任务(请原谅双关语)保存任务池。
Parallel.ForEach
阻塞直到循环完成。因此,当它在线程池上运行时,当发出一个新项目时,在ForEach
从线程池借来的线程上执行下一个。
至于内部位,作者希望Task
每个唯一键运行一个,如果尚未运行。
推荐阅读
- nginx - Nginx 在 error_page 中添加额外的`//`
- amazon-s3 - AWS S3 具有特定结尾的所有文件的总大小
- c# - 我们可以注入具有不同变量的同一类的多个实例吗?
- php - 升级 Laravel 如何选择第三方包版本
- reactjs - react-bootstrap 不会更新其 Tab.Pane 中的状态
- python - 为什么 Emotiv Cortex API 上的“应用程序没有使用许可证的权限”这个错误一直显示?
- c++ - 为什么此代码在 Visual Studio 中失败,但在在线编译器中却没有?
- javascript - 导入外部 JS 库并在 React 组件中使用
- javascript - 在保留完整数组的角度分页中是否有切片方法的替代方法?
- flutter - 如何使用嵌套类互相与蜂巢?