C# 如何避免在非’;t a‘;顶级&x2019;一个?

C# 如何避免在非’;t a‘;顶级&x2019;一个?,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我知道在异步void方法中等待时会发生不好的事情,所以如何更改代码以避免这种情况?这不是一个“顶级事件处理程序”,其中等待是“允许的”,但在调用 private async void ProgressDialog_Opened(ContentDialog sender, ContentDialogOpenedEventArgs args) { ProgressDialog p = sender as ProgressDialog; await DoCopyingAsync(p);

我知道在异步void方法中等待时会发生不好的事情,所以如何更改代码以避免这种情况?这不是一个“顶级事件处理程序”,其中等待是“允许的”,但在调用

private async void ProgressDialog_Opened(ContentDialog sender, ContentDialogOpenedEventArgs args)
{
    ProgressDialog p = sender as ProgressDialog;
    await DoCopyingAsync(p);
}

我认为进度对话框不应该负责复制,复制者不应该知道进度对话框的任何信息

await progressDialog.ShowAsync();
async void StartCopy\u单击(对象发送方,路由目标)
{
var progressDialog=新建progressDialog();
变量进度=新进度(百分比=>progressDialog.percent=百分比);
任务copyTask=DoCopyingAsync(进度);
任务showProgressTask=progressDialog.ShowAsync();
等待任务完成;
progressDialog.Hide();
等待任务完成;
}

可以在事件处理程序中等待。看看这个,例如:这不是问题吗@ap一般来说,在事件处理程序中等待是不好的。只有当您有一个同步上下文,并且对所有这些工作方式有了很好的了解时,这才适用。只是在WinForms中,所有这些都是由WinForms同步上下文处理的,所以在WinForms线程上等待UI事件通常是安全的。我已经修改了代码以反映您的建议,但遗憾的是ProgressDialog只是挂起,好像代码处于死锁状态。下面是我正在使用的代码:ProgressDialog=newprogressDialog();变量进度=新进度(百分比=>progressDialog.percent=百分比);wait Task.WhenAll(progressDialog.ShowAsync().AsTask(),DoCopying(progress,storageFiles));progressDialog.Hide();即使我将DoCopying实现更改为仅等待任务。延迟(..)它仍然挂起,所以不能挂起。好的,我已通过调用progressDialog修复了挂起问题。隐藏在DoCopying中,使ShowAsync完成。@Cleve Aha,我更新了答案以避免死锁。@piedar感谢您的帮助。感谢编辑后的版本,它使我不必在progressDialog中传递到DoCopyingAsync()。
async void StartCopy_Click(object sender, RoutedEventArgs e)
{
    var progressDialog = new ProgressDialog();
    var progress = new Progress<int>(percent => progressDialog.Percent = percent);
    Task copyTask = DoCopyingAsync(progress);
    Task showProgressTask = progressDialog.ShowAsync();
    await copyTask;
    progressDialog.Hide();
    await showProgressTask;
}