繁体   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