轉帖|其它|編輯:郝浩|2010-12-17 13:23:53.000|閱讀 3840 次
概述:wpf下的多線程操作窗口UI控件的過程和winform基本上一直,也是A線程中不能操作其他線程和主線程的控件,必須通過其他方式來處理。在winform過程是使用委托方式來處理。wpf其實也是一樣的。但是wpf提供了一個更簡單方式。本文主要介紹wpf下多線程操作窗口UI控件的處理方式,希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
wpf下的多線程操作窗口UI控件的過程和winform基本上一直,也是A線程中不能操作其他線程和主線程的控件,必須通過其他方式來處理。在winform過程是使用委托方式來處理。wpf其實也是一樣的。但是wpf提供了一個更簡單方式
可以先參考winform中處理過程 c#多線程操作Windows Forms控件
wpf中提供了全新的Dispatcher類。可以使用this.Dispatcher.BeginInvoke()或者控件.Dispatcher.BeginInvoke()這個方式和winform2.0是比較類似的。
舉個例子wpf窗口點擊一個按鈕去執行一個長時間的運算,運算的中間結果顯示在文本框中。
這是UI代碼
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" >
<Button Content="Start"
Click="startStopButton_Click"
Name="startStopButton"
Margin="5,0,5,0"
/>
<TextBlock Margin="10,5,0,0">Biggest Prime Found:</TextBlock>
<TextBlock Name="bigPrime" Margin="4,5,0,0">3</TextBlock>
</StackPanel>
后臺主要代碼這樣
public delegate void NextPrimeDelegate();//定義委托
public void CheckNextNumber()//執行這個算法,并且更新文本框內容
{.................
}
private void startStopButton_Click(object sender, RoutedEventArgs e)
{
startStopButton.Dispatcher.BeginInvoke(DispatcherPriority.Normal,new NextPrimeDelegate(CheckNextNumber));
}
這就是主要步驟和代碼。
也可以完全使用winform2.0中的方法
1。開啟新線程
2。定義委托
3.定義委托執行方法,在里面修改控件。主要代碼this.Dispatcher.BeginInvoke
wpf中多窗口線程處理
描述如下
在主窗口中打開一個線程,這個線程去啟動一個新的窗口。
代碼如下
啟動新線程:
Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
//線程調用方法
private void ThreadStartingPoint()
{
Window3 tempWindow = new Window3();
tempWindow.Show();
System.Windows.Threading.Dispatcher.Run();
}
這里面有兩個地方要注意:
第一個紅字:這個地方必須設置這個STA,否則會報錯“調用線程必須為 STA,因為許多 UI 組件都需要。”
第二個紅字:如果去掉這個紅字,會發現啟動的窗口顯示出來以后會很快就關掉。
這里有個奇怪的現象。我也不是很明白,msdn描述如下:說是啟動一個新的獨立線程來管理這個新的窗口。
一些 WPF 應用程序需要多個高級別窗口。一個線程/Dispatcher 組合管理多個窗口是完全可以接受的,但有時使用多個線程可以更出色地完成工作。如果其中一個窗口有可能獨占該線程,那么采用多個線程就更有必要。
當用戶單擊“new window”(新建窗口)按鈕時,便在一個單獨的線程中啟動了窗口的一個副本。這樣,一個窗口中的長時間運行或阻止操作就不會鎖定所有其他窗口。
新線程的起點。我們在此線程的控制下創建一個新窗口。WPF 自動創建一個新的 Dispatcher 來管理新線程。要使該窗口工作,只需啟動 Dispatcher。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載