【发布时间】:2014-05-08 13:03:52
【问题描述】:
我正在构建一个数据流管道来执行自然流中的各种处理(主要是 I/O,但也有一些 CPU 处理)。流程目前处于这种基本模式:
- 从文件中加载数据
- 使用转换块解析记录
- 通过 REST 将对象序列化并上传到服务器
此处理管道可以自动启动,也可以通过 GUI 启动。因为当它从 GUI 启动时,我想向最终用户提供进度消息。如果我在第 1 步和第 2 步之间添加 BufferBlock 并在第 3 步之后添加 ActionBlock 并将它们设置为在与 UI 相同的线程上运行,其他块是否仍会使用自己的线程池在 UI 上运行?
我正在查看这篇 MSDN 文章:http://msdn.microsoft.com/en-us/library/hh228605(v=vs.110).aspx,但关于这种行为并不是很清楚。我可以从可以在 UI 线程上运行的管道中触发一个事件来完成此操作吗?
编辑:管道将从 UI 上的 BackgroundWorker 对象启动,而不是直接从 UI 线程启动。
【问题讨论】:
-
您是否使用
DataflowBlockOptions.TaskScheduler使其运行UI 线程?一段代码会有所帮助。 -
@Noseratio 这更像是一个理论问题。我还在计划这个功能。截至目前,它还没有报告进度。使用
DataflowBlockOptions.TaskScheduler是我要告诉那些特定块在 UI 线程上运行的方式。 -
我会使用
Progress<T>模式,而不是使用 UI 线程 TaskScheduler。 -
我认为你在这里不需要
BackgroundWorker。只需在 UI 线程上创建Progress<T>(它确实捕获 s. 上下文并在内部使用sc.Post)。然后在取得进展的任何地方从您的 Dataflow 管道中调用它。 -
@Noseratio 感谢您的建议。我会调查一下。
标签: c# multithreading user-interface dataflow tpl-dataflow