c#异步/等待不更新UI

时间:2015-03-11 23:45:26

标签: c# user-interface asynchronous async-await

我正在学习在我的任务之一上实现async / await,这需要很长时间才能完成。任务完成后,应更新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();
        }

我还有一个单独的事件处理程序,它突出显示行red是文件无效:

    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更新async await中的UI的正确方法?我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

不,您不必“调用”,上下文将在异步方法调用完成后切换回来,即await之后的语句将在UI线程中执行。