【发布时间】:2013-06-02 02:03:41
【问题描述】:
我有一个用于大型 CSV 文件的解析器类。 parse 方法逐行读取大文件的工作是在 backgroundWorker 中完成的。使用backgroundWorker.ReportProgress 方法将完成百分比信息传递给UI 线程,这样我的表单上的进度条就可以完成它的工作。效果很好。
但是,我还想引发一个自定义事件,该事件将从 CSV 文件的第一行中获取的字段名列表发送回 UI (WPF),以便可以将它们放置在下拉列表中。如果解析器遇到格式错误的行或其他障碍,我还想通过事件通知用户。
我在后台执行的解析器进程能否简单地引发一个事件?还是必须将 SynchronizationContext.Current 从主 UI 线程传递给我的解析器类,然后它会使用 Post 方法?
【问题讨论】:
-
创建一个继承自
BackgroundWorker的类,创建你自己的事件,从你的worker的DoWork方法调用它? -
@gunr2171 - 这并不能解决问题,因为如果您在 DoWork 处理程序中执行此操作,事件仍将在后台线程上引发(因此其处理程序也将在后台线程上运行)。仍然需要一些在 UI 线程上调度工作的方法。
-
@KirillShlenskiy,是的,您从
DoWork方法引发事件,但您从工作人员外部订阅它。你必须做一些调用(我认为)才能让它回到主线程,但这不应该挂起工作线程。 -
考虑使用
Task和 async/await 代替。 -
@gunr2171 对,你没有详细说明调用部分......很明显 OP 没有得到那个部分......
标签: c# wpf backgroundworker synchronizationcontext