Это классический тупик. Когда ваш код ожидает, управление возвращается к основному потоку, который является ожиданием блокировки для DoWork GetResult (); Когда поток Task.Run завершен, элементы управления пытаются вернуться к основному потоку, но ожидают завершения работы DoWork. Вот почему последний оператор If никогда не выполняется.
Но кроме тупика , в вашем коде есть еще одна проблема, которая заставит ваш пользовательский интерфейс заморозить. Это метод form.Show (). Если вы удаляете все, что связано с async-await и только используйте форму, она все равно будет зависать. Проблема в том, что метод Show ожидает цикл сообщений Windows, который будет предоставлен, если вы создадите приложение Windows.Forms, но здесь вы запускаете форму из консольного приложения, которое не имеет цикла сообщений. Одним из решений будет использование form.ShowDialog, который создаст свой собственный цикл сообщений. Другое решение заключается в использовании метода System.Windows.Forms.Application.Run, который предоставляет цикл сообщений win для формы, созданной через поток пула потоков. Я могу дать вам одно возможное решение, но вам решать, как вы структурируете свой код в качестве основной причины.
static void Main(string[] args)
{
TestForm form = new TestForm();
form.Load += Form_Load;
Application.Run(form);
}
private static async void Form_Load(object sender, EventArgs e)
{
var form = sender as Form;
string s = await Task.Run(() =>
{
System.Threading.Thread.Sleep(5000);
return "Plop";
});
if (s == "Plop")
{
form?.Close();
}
}