gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:41:26 25 4
gpt4 key购买 nike

当我尝试在我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com