【发布时间】:2014-08-20 17:24:23
【问题描述】:
当我在 wpf 中使用 dispatcher.invoke 方法时,我遇到了一个非常奇怪的问题。
背景:
我定义了一个用户控件有一个 DoWorkEventArgs 来支持一些异步工作:
public class MyUserControl : UserControl
{
private BackgroundWorker bw;
public MyUserControl()
{
bw.DoWork += new DoWorkEventHandler(DoWorkMethod);
}
public void StartWork()
{
bw.RunWorkerAsync();
}
void DoWorkMethod(object sender, DoWorkEventArgs e)
{
this.Dispatcher.Invoke((System.Action)delegate()
{
//Add some item in a ListBox, this ListBox is defined in the user control.
TextBlock b = new TextBlock();
//some code
Listbox.Items.Add(b);
}
}
}
当单击按钮时,我创建了此用户控件的 2 个实例并在那里调用 StartWork 方法:
MyUserControl control1 = new MyUserControl();
MyUserControl control2 = new MyUserControl();
control1.StartWork();
control2.StartWork();
问题出在这里,有时候usercontrol1的ListBox没有更新,里面没有item,有时候usercontrol2的ListBox也会出现这种情况,我调试了一下,发现代码运行正常,就是ListBox.Items。添加方法运行,结果就是不出来。 如果我将 Dispatcher.Invoie 更改为 Dispatcher.BeginInvoke,则很正常。 有人知道原因吗?
【问题讨论】:
-
如果这是你的真实代码,你根本不需要
BackgroundWorker。您可以在StartWork方法中直接将TextBlock 添加到Listbox。 -
您创建了 BackgroundWorker,它应该在与 UI 没有连接的情况下工作,一旦启动,您就切换回 UI。先考虑一下。
-
您对
BackgroundWorker的使用无效,因为您试图在UI 线程上运行DowWork方法,但该方法的全部目的是它在后台线程上运行。 -
@Agent_L,你读过这个问题吗?
标签: c# wpf dispatcher