我正在学习在我的任务之一上实现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的正确方法?我该怎么做才能解决这个问题?
答案 0 :(得分:1)
不,您不必“调用”,上下文将在异步方法调用完成后切换回来,即await之后的语句将在UI线程中执行。