2015-09-10 56 views
-1

我有这样的代码:为什么该方法不被称为异步任务?

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 

为什么这是不是这样做?

+0

这是否编译?您没有在等待任何任务。 –

+0

为什么你在这里使用'async'?你没有在等待任何东西。 –

+1

永远不要使用任务构造函数。 – usr

回答

1

试试这个:

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任务异步等待其完成。请参阅this article了解有关异步等待的一些很好的建议。

我也移除了StartAll返回Taskasync方法需要在它的await和你没有任何。

0

Windows窗体中的控件绑定到特定的线程并且不是线程安全的。因此,如果您从其他线程调用控件的属性,则需要使用GUI线程正确调度该任务。因此,稍微修改您的代码以创建任务计划程序并运行Task.Start方法的重载版本,如下所示。

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"; 
} 
相关问题