2015-09-10 6 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 за отличный совет по асинхронному ожиданию.

Я также удалил возвращенный Task из StartAll как async метода должно иметь в нем await и вы не получили никаких.

0

Элементы управления в Windows Forms привязаны к определенному потоку и не являются потокобезопасными. Поэтому, если вы вызываете свойство элемента управления из другого потока, задача должна быть правильно запланирована с помощью потока 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"; 
} 
Смежные вопросы