在winform中等待不起作用

时间:2017-07-30 14:27:38

标签: c# winforms async-await

当我尝试调试此应用程序时,以下代码将是阻止

await Task.Delay(TimeSpan.FromSeconds(1.5));

在WinForm应用程序中。

在控制台应用程序中,它运行良好。有没有人知道是什么导致了这个以及如何解决它?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Run().Wait();
    }

    public async Task Run()
    {
        await Run2();
    }

    public static async Task<bool> Run2()
    {
        var task = Task.FromResult(true);
        await Task.Delay(TimeSpan.FromSeconds(1.5));
        return await task;
    }
}

1 个答案:

答案 0 :(得分:3)

参考:Async/Await - Best Practices in Asynchronous Programming

  

在控制台应用程序中,它运行良好。有没有人知道是什么导致了这个

注意:不要混用阻塞和异步代码

例外:控制台主要方法

  

“始终异步”意味着你不应该混合同步和   异步代码没有仔细考虑后果。在   特别是,通过调用阻止异步代码通常是个坏主意   Task.Wait或Task.Result。

  

以及如何解决?

使用异步事件处理程序。

public Form1() {
    InitializeComponent();
    this.Load += Loaded;
}

public async void Loaded(object sender, EventArgs args) {

    await Run();//Non blocking thread
}

public async Task Run() {
    await Run2();
}

public static async Task<bool> Run2() {
    var task = Task.FromResult(true);
    await Task.Delay(TimeSpan.FromSeconds(1.5));
    return await task;
}