使用任務(AsyncCtp with Silverlight 4):
public void Load(){
this.IsBusy = true;
Task.Factory.StartNew(()=> DoHeavyWork())
.ContinueWith(t => this.IsBusy = false);
}
它會變得更好,如果你可以使用新的異步/等待與異步CTP或VS2012/Silverlight 5
public async void Load(){
try{
this.IsBusy = true;
await Task.Factory.StartNew(()=> DoHeavyWork());
}
finally
{
this.IsBusy = false;
}
}
編輯
功能
我假設你正在更新後臺任務中的ObservableCollection。這確實會給你帶來問題,因爲處理集合更新的處理程序沒有在UI線程中運行,所以集合更新與綁定系統不是線程安全的。爲了達到這個目的,你必須將這些項目添加到UI線程的ObservableCollection中。如果你能一次獲取所有的物品,你可以這樣做:
public async void Load(){
try{
this.IsBusy = true;
// Returns the fetched items
var items = await Task.Factory.StartNew(()=> DoHeavyWork());
// This will happen in the UI thread because "await" returns the
// control to the original SynchronizationContext
foreach(var item in items)
this.observableCollection.Add(item);
}
finally
{
this.IsBusy = false;
}
}
如果您有批量加載,您可以使用當前Dispatcher添加項目到集合,就像我在this answer建議。
你能發佈你的BGW代碼嗎? –