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