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

标签 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 窗体应用程序并将代码放在 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 });
}

引用 Async/Await - Best Practices in Asynchronous Programming

关于C# WPF/WinForms - 在 WPF/WinForm 中调用异步方法永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52756297/

相关文章:

c# - 为什么 params 'less performant' 不是常规数组?

c# - 如何设置图像上下文菜单项的图标

wpf - 当用户在菜单外单击时,如何使WPF上下文菜单消失?

c# - NotifyIcon 是否具有 MouseDown 等效项?

c# - 调用 DoubleClick Bid Manager API

c# - 获取两个 DateTime 实例的差值(以毫秒为单位)

c# - 在 List<Parent> 对象的泛型函数中使用子类型

c# - CLR调试器和 'var'

wpf - WPF 布局中的 TextBlock 包装

c# - 第一次 Access 数据库连接失败