为什么该方法没有作为异步任务调用
本文关键字:异步 任务 调用 方法 为什么 | 更新日期: 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";
}