2012-06-22 41 views
-1

,我有一個列表框控件和兩個按鈕。我希望能夠使用第二個按鈕,當我點擊第一個按鈕,直到添加數字沒有細化他的工作。我使用dispatcher.begininvoke,但這增加了主線程上的工作。如何同步這個線程?我想能夠使用第二個按鈕,移動窗口或使用其他UI元素addnumbers processing ..調用線程不能訪問這個對象,因爲一個不同的線程擁有它。我不想在wpf中使用調度器

void AddNumbers() 
    { 

       for (int i = 1; i <= 1000000; i++) 
       { 
        listBox1.Items.Add(i); 
       } 

    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 

     Thread thr = new Thread(new ThreadStart(AddNumbers)); 
     thr.Start(); 


    } 

    private void button2_Click(object sender, RoutedEventArgs e) 
    { 

     MessageBox.Show("Hello World!"); 
    } 
+1

你不能。這不是需要時間的循環,而是「Add」調用。儘管如此,你可以做的是試着在'listBox1.BeginUpdate()'和'listBox1.EndUpdate()'中包裝這個方法來阻止它在中間畫圖。 – Ryan

+1

這將需要調度程序或帶有數據綁定的線程安全'observablecollection'。使用調度程序沒有任何問題。 – Tyrsius

回答

0

只有主(UI)線程可以訪問UI控件。爲什麼你需要一個Listbox中的一百萬件物品? Listbox支持虛擬化。使用BackgroundWorker(或線程)創建列表,然後在RunWorkerCompleted上將List綁定到UI ListBox。就同​​步而言,只需在啓動BackgroundWorker時啓用/禁用,並在回調中啓用/禁用。同樣,你爲什麼需要ListBox中的一百萬個項目?

http://msdn.microsoft.com/en-us/library/cc221403(v=VS.95).aspx

+0

添加100萬個項目是一個很長的調用。其實我想知道我可以使用非法的交叉線程調用,然後我處理線程同步UI元素。順便說一句... – jertal

+0

確定然後評論模擬長操作會因爲我認爲它是一個渲染問題。我仍然會考慮後臺和禁用啓用。我同意Tyrsius的評論。 – Paparazzi

相關問題