当我尝试在我的 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;
}
2:
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 窗体应用程序并将代码放在 Program.cs 中的“Application.Run(frmMain)”后面时,它也在运行。
那么我的异步方法调用和 WPF/Forms 怎么了?
最佳答案
when I debug it stops at this method call and nothing happens.
.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 });
}
关于C# WPF/WinForms - 在 WPF/WinForm 中调用异步方法永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52756297/