我是C#.net的初学者。我在wpf中有一个简单的应用程序,可以从用户线程访问列表框。在winforms我可以使用invokerequired,相当于使用调度程序的wpf没有帮助。我的系统也挂起按钮,所以调试。请为以下代码提供解决方案。提前谢谢
private void Monitor_mtd()
{
while (AppStatus != 0)
{
if (flag2 == 1)
{
listBox1.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new list1MtdDelegate(list1Mtd), "Best practice");
}
}
}
private delegate void list1MtdDelegate(string ls1);
private void list1Mtd(string ls1)
{
listBox1.Items.Add(ls1);
}
private void button1_Click_1(object sender, RoutedEventArgs e)
{
Monitor = new Thread(new ThreadStart(Monitor_mtd));
Monitor.Start();
flag1 = 1;
}
private void button2_Click(object sender, RoutedEventArgs e)
{
flag2 = 1;
}
答案 0 :(得分:0)
您的方法中会出现一些问题。首先,将数据绑定到ListBox,然后尝试从用户线程更新ListBox。
您可以使用ObservableCollection解决ListBox的绑定,以便使用必要的值更新UI(有关此内容的详细信息,请查看this帖子)。但是,这也引发了另一个问题,即ObservableCollection不能从另一个调度的线程调用(请参阅此here上的更多内容)。这意味着您需要ObservableCollection的另一个实现。 Thomas Levesque做了一个AsyncObservableCollection,可以从任何线程修改,并在修改后仍然通知用户界面。
我制作了一个示例实现,您可以下载here来显示完整的解决方案。