使用任务(AsyncCtp 和 Silverlight 4):
public void Load(){
this.IsBusy = true;
Task.Factory.StartNew(()=> DoHeavyWork())
.ContinueWith( t => this.IsBusy = false);
}
如果您可以将新的 async/await 功能与 Async 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 将项目添加到集合中,就像我在这个答案中建议的那样。