C# WPF / WinForms - 在 WPF / WinForm 中调用异步方法永远不会完成



当我尝试在 WPF 项目中调用异步方法时,它永远不会停止并返回任何内容。

我尝试了几件事,例如:

1:

public wndMain()
{
InitializeComponent();
Initialize();
}
private void Initialize()
{
IList<Docker.DotNet.Models.ContainerListResponse> myContainers = myClient.Containers.ListContainersAsync(new Docker.DotNet.Models.ContainersListParameters() { All = true }).Result;
}

阿拉伯数字:

public wndMain()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
IList<Docker.DotNet.Models.ContainerListResponse> myContainers = myClient.Containers.ListContainersAsync(new Docker.DotNet.Models.ContainersListParameters() { All = true }).Result;
}

但是什么也没发生,当我调试时,它会在此方法调用处停止,没有任何反应。

具有讽刺意味的是:

当我在 C# 控制台应用程序中放置完全相同的方法调用时,它正在运行......不知道为什么。

第二个讽刺的是:

当我创建一个C# Windows Forms应用程序并将代码放在程序中的"Application.Run(frmMain("后面时.cs它也在运行。


那么我的异步方法调用和 WPF/窗体是怎么回事?

当我调试时,它会在此方法调用处停止,没有任何反应。

.Result阻止调用导致死锁。

事件处理程序允许async void.因此,可以重构第二个选项以等待结果,而不会阻塞 UI 线程

private async void Window_Loaded(object sender, RoutedEventArgs e) {
IList<Docker.DotNet.Models.ContainerListResponse> myContainers = 
await myClient.Containers.ListContainersAsync(new Docker.DotNet.Models.ContainersListParameters() { All = true });
}

参考异步/等待 - 异步编程的最佳实践

最新更新