C# Windows窗体中的异步/等待

C# Windows窗体中的异步/等待,c#,multithreading,winforms,C#,Multithreading,Winforms,我有一个带有ListView控件的主窗体,其中包含我的域(Active Directory)中的远程计算机列表。通过右键单击任何项目,将打开第二个表单,其中包含该计算机的WMI对象详细信息。检索这些数据需要一些时间,所以我想打开第三个表单,只是显示一条“请稍候”之类的消息。这是我的主要表单中的代码: private async void cmShowDetails_Click(object sender, EventArgs e) { nomeComputer = lvElencoMac

我有一个带有ListView控件的主窗体,其中包含我的域(Active Directory)中的远程计算机列表。通过右键单击任何项目,将打开第二个表单,其中包含该计算机的WMI对象详细信息。检索这些数据需要一些时间,所以我想打开第三个表单,只是显示一条“请稍候”之类的消息。这是我的主要表单中的代码:

private async void cmShowDetails_Click(object sender, EventArgs e)
{
    nomeComputer = lvElencoMacchine.SelectedItems[0].Text;

    HamsterWheel hw = new HamsterWheel(); // create an instance of the waiting form

    await Task.Run(()=> {
        WorkstationDetails wdForm = new WorkstationDetails(nomeComputer, FUNZIONEFORM.VISUALIZZAZIONE);
        hw.Close();
        if (!wdForm.IsDisposed) wdForm.ShowDialog();
        });

    hw.ShowDialog();
}
我看到,一旦调用表单的构造方法,我必须在其中显示机器细节,重点仍然是该线程。我错过了什么?ù

谢谢。
Davide.

您可以使用SynchronizationContext.Current来运行异步代码,最终更新UI

    SyncronizationContext.Current.Post(d => {
        'YOUR CODE HERE'
    }, null);

这允许您在UI线程上运行异步代码,这可能是跨线程问题的根源。

删除等待/异步,让任务运行。@Nkosi-uhm。。。它一直工作到尝试调用hw.close(),这使我得到一个无效的跨线程操作。右键将wait表单作为状态对象传递给Run任务,并从中提取访问权限。我忽略了交叉线程。您有什么理由反对吗?@MrMoose您认为创建对象、添加事件处理程序、在BGW上设置各种属性比只等待调用
任务更简单。运行
,后台工作完成后,在UI线程中运行
wait
之后的代码?老实说,我发现向人们解释基于事件的异步模型要比
wait
困难得多。(已经向许多不同的人解释了这两个问题。)