Я прочитал (и использовал) async/жду довольно много в течение некоторого времени, но у меня все еще есть один вопрос, на который я не могу получить ответ. Скажем, у меня есть этот код.Как выполняется несколько задач асинхронно в потоке пользовательского интерфейса с использованием async/wait?
private async void workAsyncBtn_Click(object sender, EventArgs e)
{
var myTask = _asyncAwaitExcamples.DoHeavyWorkAsync(5);
await myTask;
statusTextBox.Text += "\r\n DoHeavyWorkAsync message";
}
Он вызывается из потока пользовательского интерфейса и возвращается в поток пользовательского интерфейса. Поэтому я могу делать специфические для UI вещи в этом методе и после await myTask
. Если бы я использовал .ConfigureAwait(false)
, я бы получил исключение потока при выполнении statusTextBox.Text += "\r\n DoHeavyWorkAsync message";
, так как я бы сказал myTask
, это нормально, чтобы взять любой доступный поток из пула потоков.
Мой вопрос. Насколько я понимаю, в этом случае я никогда не покидаю поток пользовательского интерфейса, но он выполняется асинхронно, пользовательский интерфейс все еще реагирует, и я могу одновременно запустить несколько Заданий и тем самым ускорить свое приложение. Как это может работать, если мы используем только один поток?
Спасибо!
EDIT для Sievajet
private async void workAsyncBtn_Click(object sender, EventArgs e)
{
await DoAsync();
}
private async Task DoAsync()
{
await Task.Delay(200);
statusTextBox.Text += "Call to form";
await Task.Delay(200);
}
Вы конкретно говорить о marshaling работы обратно на поток пользовательского интерфейса? –
Теперь я вижу, что вопрос не так специфичен, как я думал, что его можно интерпретировать по-разному. Мне стало лучше понимать ваш ответ @ Юваля Ицчакова, и после прочтения ответа Сивайета я вижу, что есть еще один ответ, когда нет связанной операции асинхронного ввода-вывода. – Andreas
@ Andreas Я вижу, что вы добавили еще один пример, и он работает, потому что снова: нет нити. Вы читали в http://blog.stephencleary.com/2013/11/there-is-no-thread.html, как предложил Юваль? – Krumelur