[英]Using Tasks but the UI is still blocked
我有一個WPF MVVM c#應用程序。 在我的一種視圖中,單擊按鈕后,我必須從數據庫中檢索數據。 對數據庫的調用確實很長,因此我想在進行調用時啟用微調器,並在調用完成后將其禁用。
因此,在處理按鈕單擊的方法中(使用Command,而不是后面的代碼),我設置了boolean變量以啟用微調器,然后創建一個Task
,它將獲取數據並將其設置為ObservableCollection<T>
如下所示
private void GetDataButtonCommand() {
this.IsBusy = true;
var tasks = new List<Task>();
tasks.Add(Task.Factory.StartNew(() =>
{
System.Windows.Application.Current.Dispatcher.BeginInvoke(new System.Action(() =>
{
var GotData= DBHelper.GetData();
_observablecollectionname.Clear();
foreach (var item in GotData)
{
_observablecollectionname.Add(item);
}
}));
}));
var finalTask = Task.Factory.ContinueWhenAll(tasks.ToArray(), datacomplete =>
{
this.IsBusy = false;
});
}
完成Task
后,我想禁用微調器。
我遇到的問題是在通話過程中看不到微調框。 即使您正在使用Task
來執行數據庫查詢,UI仍被阻止。
我究竟做錯了什么?
您的代碼正在UI thead上運行。
您可以在System.Windows.Application.Current.Dispatcher.BeginInvoke(new System.Action(() => { ... }))
進行所有操作,因此自然會阻塞UI。
僅在確實需要執行UI操作時才應調用調度程序。
移動var GotData= DBHelper.GetData();
在調度員之前。
但是最好使用C#5.0及更高版本的async
/ await
模式/關鍵字。
當我有長時間運行的查詢時,我總是使用下面的代碼。
private async void button1_Click(object sender, EventArgs e)
{
var list = await GetDatabaseAsync();
//do whatever you need with the list.
}
private async Task<List<string>> GetDatabaseAsync()
{
var list = Task.Run(() =>
{
var _observablecollectionname = new List<string>();
var GotData = Helper.GetData();
_observablecollectionname.Clear();
foreach (var item in GotData)
{
_observablecollectionname.Add(item);
}
return _observablecollectionname;
});
return await list;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.