首页 > 解决方案 > Windows 窗体中的异步/等待

问题描述

我有一个带有 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();
}

我看到一旦调用表单的构造方法,我必须在其中显示机器细节,焦点仍然在那个线程上。我错过了什么?ù

谢谢。戴维德。

标签: c#multithreadingwinforms

解决方案


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

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

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


推荐阅读