2

问题很简单我有 GUI c#/xaml 应用程序,我想在一个线程中运行 GUI,在另一个线程中运行一些方法(无限循环)。我需要从第二个线程修改 GUI(列表框)中的元素。我尝试从网络创建全局变量和其他一些技巧,但没有一个运行良好。

现在我有类似的东西:

public delegate void InvokeDelegate(listdata Mujlist);
//in global scope
// and in Window class
public void UpdateList(listdata Mujlist)
{
    mujlistbox.DataContext = Mujlist;
}
// and in the second thread this
object[] obj = new object[1];
obj[0] = Mujlist;
mujlistbox.BeginInvoke(new InvokeDelegate(UpdateList), obj);

这可能做得很好,但我不能尝试这个,因为 VS 2010 发现错误

Error 1 'System.Windows.Controls.ListBox' does not contain a definition for 'BeginInvoke' and no extension method 'BeginInvoke' accepting a first argument of type 'System.Windows.Controls.ListBox' could be found (are you missing a using directive or an assembly reference?)   D:\..\MainWindows.xaml.cs 85 28 WPFChat

但是 System.Windows.Forms这种方法,所以我对此感到困惑

所以,问题是我怎样才能简单地从子线程更新“GUI线程”中的列表框?

我哪里出错了?有更好的方法吗?如何?

4

2 回答 2

3

使用 WPF,您需要使用该Dispatcher.BeginInvoke方法。

虽然ListBox是 a UIElement,它不包含BeginInvoke方法,但它确实派生自DispatcherObject. 因此,它有一个Dispatcher属性可用于访问Dispatcher

mujlistbox.Dispatcher.BeginInvoke(new InvokeDelegate(UpdateList), obj);
于 2012-10-12T19:11:46.367 回答
0

使用 aBackGroundWorker并在方法中实现您的长时间运行的操作BackGroundWorker.DoWork。添加进度报告处理程序并从进度事件更新您的 UI。简单得多。

请参阅问题的标记答案

于 2012-10-12T19:10:58.793 回答