C # WPF / WinForms - вызов асинхронного метода в WPF / WinForm никогда не завершается - PullRequest
0 голосов
/ 11 октября 2018

Когда я пытаюсь вызвать асинхронный метод в моем проекте 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 и поместилкод, стоящий за «Application.Run (frmMain)» в Program.cs, который он тоже запускает.


Так в чем же дело с моим вызовом асинхронного метода и WPF / Forms?

1 Ответ

0 голосов
/ 11 октября 2018

когда я отлаживаюсь, он останавливается на этом вызове метода, и ничего не происходит.

.Result блокирующий вызов вызывает тупик.

Обработчики событий позволяют async void,Таким образом, ваш второй вариант может быть реорганизован для ожидания результата без блокировки потока пользовательского интерфейса

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 });
}

Ссылка Асинхронное / ожидание - Лучшие практики асинхронного программирования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...