文章速覽
- UI線程切換
- 示例
- 后臺線程使用
- 示例
- 兩者對比
- 適用場景
- Application.Current.Dispatcher.Invoke
- Task.Factory.StartNew
- 執行同步性
- Application.Current.Dispatcher.Invoke
- Task.Factory.StartNew
一個贊,專屬于你的足跡!
UI線程切換
在WPF應用程序中,UI元素只能由創建其的線程(通常UI線程)進行訪問和修改。當我們從非UI線程嘗試訪問UI元素時,就需要通過使用【Application.Current.Dispacher.Invoke】將操作切換到UI線程。
示例
假設有一個按鈕點擊事件,在后臺線程中進行一些處理后需要更新 UI 文本框的內容:
private void Button_Click(object sender, RoutedEventArgs e)
{Task.Factory.StartNew(() =>{// 后臺線程中處理數據string result = LongRunningOperation();// 使用 Dispatcher.Invoke 更新 UIApplication.Current.Dispatcher.Invoke(() =>{textBox.Text = result;});});
}
private string LongRunningOperation()
{// 模擬耗時操作Thread.Sleep(3000);return "Result";
}
后臺線程使用
當進行計算密集型任務或者耗時的操作(如數據處理、網絡請求等),可以使用 【Task.Factory.StartNew】啟動一個新線程來完成。
此處可以結合著同步、異步、并發來思考。
相關文章:
同步、異步、并發的區別
示例
如果只需要進行后臺計算而不需要更新 UI:
private void Button_Click(object sender, RoutedEventArgs e)
{Task.Factory.StartNew(() =>{// 在后臺線程中執行計算任務int result = CalculateResult();// 這里沒有更新 UI 的操作});
}
private int CalculateResult()
{// 模擬計算任務Thread.Sleep(2000);return 42;
}
兩者對比
適用場景
Application.Current.Dispatcher.Invoke
主要用于需要更新 UI 的情況。
例如,在多線程程序中,當一個后臺線程完成了數據的計算或獲取,需要將結果顯示在 UI 上(如更新文本框、列表框等控件的內容),此時就需要使用 Application.Current.Dispatcher.Invoke 將更新 UI 的代碼放到 UI 線程來執行。
Task.Factory.StartNew
更適用于需要并行處理任務的場景。比如,同時處理多個文件的讀寫操作,或者同時進行多個網絡請求,或者執行一些復雜的計算任務,而這些任務不需要頻繁地更新 UI。通過 Task.Factory.StartNew 可以有效地利用多核 CPU 的性能,提高程序的執行效率。
執行同步性
Application.Current.Dispatcher.Invoke
Invoke 方法是同步執行的。當調用 Invoke 時,調用線程(通常是后臺線程)會一直等待直到 UI 線程完成指定的操作后才會繼續執行后續的代碼。這意味著如果 Invoke 中的操作比較耗時,調用線程會被阻塞。
Task.Factory.StartNew
一般用于啟動異步任務。
任務一旦啟動,它會在后臺線程池中獨立運行,調用線程(一般是 UI 線程)不會等待任務完成就繼續執行后續代碼。不過,可以通過一些同步機制(如 Wait、Result 等)來等待任務完成,但這不是默認的行為。