如何在不调用Wait()的情况下保持RunAsync()方法在后台运行?

Rol*_*and 3 c# task backgroundworker async-await

尝试从使用BackgroundWorker升级到Task,我对如何在不调用Wait()的情况下保持后台作业运行感到困惑.

这是后台工作(简化):

    private async Task RunAsync()
    {
        HttpResponseMessage response = await TheHttpClient.GetAsync(Path);
        if (response.IsSuccessStatusCode)
        {
            textBox_Response.Text = await response.Content.ReadAsStringAsync();
        }
    }
Run Code Online (Sandbox Code Playgroud)

单击"发送"按钮时,上面的代码应该运行,但由于后台代码有多个await异步调用,我猜Wait()需要多次调用:

    private void button_Send_Click(object sender, EventArgs e)
    {
        Task t = RunAsync();
        while (!t.IsCompleted)
        {
            t.Wait();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但这会在后台作业的整个处理时间内阻止GUI.

如何启动后台作业并立即从按钮单击处理程序返回,同时允许后台作业运行所有异步调用?

我知道如何使用BackgroundWorker实现这一点,我不应该在这里使用任务吗?

Sco*_*ain 6

事件处理程序是您唯一允许执行的操作async void,您所做的是使事件处理程序异步并在那里等待它

private async void button_Send_Click(object sender, EventArgs e)
{
    await RunAsync();

    //Do code here that needs to run after RunAsync has finished.
}
Run Code Online (Sandbox Code Playgroud)