2011-05-20 149 views
18

我想讓我的UI在我的WPF應用程序中更具響應性。我用產卵使用Task.Factory.StartNew時更新UI標籤

Task.Factory.StartNew(() => RecurseAndDeleteStart()); 

在該方法中RecurseAndDeleteStart()我要更新與被刪除的文件的UI標籤的新線程。

如何做到這一點?

回答

43

由於它是WPF,您可以使用Dispatcher並調用Dispatcher.BeginInvoke將回調封送到UI線程以更新標籤。

或者,你可以傳遞的TaskScheduler到你的方法,並用它如下更新標籤:

// This line needs to happen on the UI thread... 
TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 

Task.Factory.StartNew(() => RecurseAndDeleteStart(uiScheduler)); 

然後,你的方法裏面,當你想更新一個標籤,你可以這樣做:

Task.Factory.StartNew(() => 
    { 
     theLabel.Text = "Foo"; 
    }, CancellationToken.None, TaskCreationOptions.None, uiScheduler); 

這將推動回調到UI線程的同步上下文。

+1

完美!正是我在找什麼。 – Demetri 2011-05-20 18:36:04

+1

+1表示可以在不同的計劃程序上運行子任務(另一個用於顯示「CancellationToken.None」的+1) - 我已經傳遞了新的CancellationToken(),但它似乎是破解!) – axeman 2013-08-19 20:15:11

+0

正在工作偉大 – MonsterMMORPG 2015-01-01 00:50:04

2

您必須使用label.Dispatcher.BeginInvoke(delegate)來調用不同線程中的任何內容,以改變標籤的內容。