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

Kev*_*vin 1 c# wpf asynchronous winforms

当我尝试在我的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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

但没有任何反应,当我调试它停止在这个方法调用时没有任何反应.

具有讽刺意味的是:

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

第二个具有讽刺意味的是:

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


那么我的异步方法调用和WPF/Forms有什么关系呢?

Nko*_*osi 5

当我调试它停止在这个方法调用时没有任何反应.

.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 });
}
Run Code Online (Sandbox Code Playgroud)

参考Async/Await - 异步编程的最佳实践