【问题标题】:Backgroundworker calling Dispatcher.Invoke后台工作人员调用 Dispatcher.Invoke
【发布时间】:2013-04-03 05:17:23
【问题描述】:

我正在处理其他人编写的代码。它包含一个后台工作程序,从其 DoWork 调用 Dispatcher.Invoke。

我的问题是我认为我的 BackgroundWorkerCompleted 将在我的 Dispatcher.Invoke 完成之前发生。对吗?

Dispatcher.Invoke 会启动一个新线程还是从主线程开始?

将 Dispatcher 与 Backgroundworker 混合使用是不是一个坏主意?我发现的样本似乎只使用了其中一个。

【问题讨论】:

    标签: c# backgroundworker dispatcher


    【解决方案1】:

    我的问题是我认为我的 BackgroundWorkerCompleted 会发生 在我的 Dispatcher.Invoke 完成之前。对吗?

    不,那不正确。

    Dispatcher.Invoke 会启动一个新线程还是从主线程开始?

    不,它将在 UI 线程上执行代码。因此,它将防止您获得跨线程异常。通常用于修改 GUI 内容。

    见Dispatcher.Invoke

    在 WPF 中,只有创建 DispatcherObject 的线程可以访问 那个物体。例如,一个背景 线程从 主 UI 线程无法更新 Button 的内容 在 UI 线程上创建。为了让后台线程访问 Button的Content属性,后台线程必须 将工作委托给与 UI 线程关联的 Dispatcher。 这是通过使用 Invoke 或 BeginInvoke 来完成的。调用是 同步和 BeginInvoke 是异步的。该操作被添加到 指定 DispatcherPriority 的 Dispatcher 的事件队列。

    【讨论】:

    • 谢谢。我发现 Invoke 中调用的方法会产生一个新的 Task()。这就解释了为什么我的完成会在我的实际工作完成之前触发。真是一团糟!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多