2012-10-02 73 views
1

我是C#.net的初學者。我有一個簡單的應用程序在wpf中訪問用戶線程的列表框。在WinForms中,我可以使用invokerequired,對於使用調度程序的wpf等價物沒有幫助。我的系統也掛起按鈕,所以調試雖然。請爲下面的代碼提供解決方案。在此先感謝使用調度程序從非UI線程訪問UI不起作用

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

在您的方法中出現了一些問題。首先,您將數據綁定到ListBox,然後嘗試從用戶線程更新ListBox。

您可以通過使用ObservableCollection來解決ListBox的綁定,以便使用必要的值更新UI(有關此更多信息,請參閱this)。但是,這也引發了另一個問題,那就是ObservableCollection不能從調度的其他線程中調用(另請參閱here)。這意味着您需要ObservableCollection的另一個實現。 Thomas Levesque做了一個AsyncObservableCollection,它可以從任何線程修改,並在修改後仍然通知UI。

我做了一個示例實現,您可以下載here顯示完整的解決方案。