为什么该方法没有作为异步任务调用

本文关键字:异步 任务 调用 方法 为什么 | 更新日期: 2023-09-27 18:12:01

我有这样的代码:

private async void WaitAnyAll(object sender, EventArgs e)
{
    var start = new Task(() => { StartAll("Starter"); } );
    textBox1.Text += "Before" + Environment.NewLine;
    start.Start();
    textBox1.Text += "End" + Environment.NewLine;
}
private async Task StartAll(string mssg)
{
    textBox1.Text += mssg + Environment.NewLine;
}

输出这个(在文本TextBox控件中):

Before
End

但是我确定它应该输出这个:

Before
End
Starter

为什么它不这样做?

为什么该方法没有作为异步任务调用

试试这个:

private async Task WaitAnyAll(object sender, EventArgs e)
{
    var start = Task.Run(() => { StartAll("Starter"); } );
    textBox1.Text += "Before" + Environment.NewLine;
    await start;
    textBox1.Text += "End" + Environment.NewLine;
}
private void StartAll(string mssg)
{
    textBox1.Text += mssg + Environment.NewLine;
}

启动任务最好使用Task.Run,您需要将任务await异步等待其完成。有关async-await的一些很好的建议,请参阅本文。

我还从StartAll中删除了返回的Task,因为async方法需要在其中包含await,而您没有任何。

Windows窗体中的控件绑定到特定的线程,并且不是线程安全的。因此,如果您从不同的线程调用控件的属性,则需要使用GUI线程正确地调度任务。因此,稍微修改一下代码,创建一个任务调度器并运行task的重载版本。启动方法如下所示。

private async void WaitAnyAll(object sender, EventArgs e)
{
    var start = new Task(() => { StartAll("Starter"); });    
    textBox1.Text += "Before";
    var scheduler = TaskScheduler.FromCurrentSynchronizationContext();  
    start.Start(scheduler);                         
    textBox1.Text += "End";
}