簡體   English   中英

C#異步/等待不更新UI

[英]c# Async/Await not updating UI

我正在學習對我的一項任務實施異步/等待,這需要很長時間才能完成。 任務完成后,應更新DGV。

    private async void frmA_DragDrop(object sender, DragEventArgs e)
    {
        // Some codes to accept dropped files

        // Run task asynchronously
        Task<DataTable> task = Task.Run(() => PDF.CheckPDFs(Files, tblPDFs));
        dgvPDF.DataSource = await task;
     }

我發現任務完成后,它沒有更新DGV。 因此,我添加了InvokeRequired位來手動更新表並防止跨線程異常。

        // Update UI
        if (dgvPDF.InvokeRequired)
        {
            dgvPDF.Invoke((MethodInvoker)(() => { dgvPDF.Refresh(); }));
        }
        else
        {
            dgvPDF.Refresh();
        }

我還有一個單獨的事件處理程序,突出顯示紅色行是文件無效:

    private void dgvPDF_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
    {
        if (dgvPDF["Pages",e.RowIndex].Value.ToString() == "0")
            dgvPDF.Rows[e.RowIndex].DefaultCellStyle.BackColor = System.Drawing.Color.MistyRose;
    }

發生的事情是根本沒有觸發RowAdded事件處理程序。 如果我使代碼同步(即刪除await / async並調用),那么除了UI凍結外,一切都可以正常工作

我的問題是使用InvokedRequired在異步等待中更新UI的正確方法嗎? 我該怎么做才能解決此問題?

不,您不必“調用”,在異步方法調用完成后,上下文將切換回去,即,等待后的語句將在UI線程中執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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