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

时间:2018-10-11 09:08:13

标签: c# wpf winforms asynchronous

当我尝试在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 Forms应用程序并将代码放在Program.cs中的“ Application.Run(frmMain)”后面时,它也正在运行。


那么我的异步方法调用和WPF /表单怎么了?

1 个答案:

答案 0 :(得分: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 });
}

引用Async/Await - Best Practices in Asynchronous Programming