簡體   English   中英

使用任務,但用戶界面仍然被阻止

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM