加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:33:22 所属栏目:百科 来源:网络整理
导读:尝试从使用BackgroundWorker升级到Task,我对如何在不调用Wait()的情况下保持后台作业运行感到困惑. 这是后台工作(简化): private async Task RunAsync() { HttpResponseMessage response = await TheHttpClient.GetAsync(Path); if (response.IsSuccessStat
尝试从使用BackgroundWorker升级到Task,我对如何在不调用Wait()的情况下保持后台作业运行感到困惑.

这是后台工作(简化):

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

单击“发送”按钮时,上面的代码应该运行,但由于后台代码有多个等待异步调用,我想有几个需要的Wait()调用:

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

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

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

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

解决方法

事件处理程序是唯一允许您执行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.
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读