Я читал о новых операторах async и await в C# и пытался выяснить, в каких обстоятельствах они могли бы мне пригодиться. Я изучил несколько статей MSDN и вот что прочитал между строк:
Вы можете использовать async для обработчиков событий Windows Forms и WPF, чтобы они могли выполнять длительные задачи, не блокируя поток пользовательского интерфейса, пока выполняется основная часть операции.
async void button1_Click(object sender, EventArgs e)
{
// even though this call takes a while, the UI thread will not block
// while it is executing, therefore allowing further event handlers to
// be invoked.
await SomeLengthyOperationAsync();
}
Метод, использующий await, должен быть async, а это означает, что использование любой функции async где-то в вашем коде в конечном итоге приводит к тому, что все методы в последовательности вызовов от обработчиков событий пользовательского интерфейса вплоть до метода async самого нижнего уровня также будут async.
Другими словами, если вы создаете поток с обычной старой доброй точкой входа ThreadStart (или консольным приложением со старой доброй точкой входа static int Main(string[] args)), то вы не можете использовать async и await, потому что в какой-то момент вам пришлось бы использовать await, и сделать метод который использует его async, и, следовательно, в вызывающем методе вы также должны использовать await и сделать этот async и так далее. Но как только вы достигаете точки входа в поток (или Main()), нет вызывающей стороны, которой await передал бы управление.
Таким образом, вы не можете использовать async и await без графического интерфейса, который использует стандартный цикл сообщений WinForms и WPF. Я предполагаю, что все это действительно имеет смысл, поскольку MSDN утверждает, что программирование async не означает многопоточность, а вместо этого использует свободное время потока пользовательского интерфейса; при использовании консольного приложения или потока с определяемой пользователем точкой входа многопоточность будет необходима для выполнения асинхронных операций (если не используется совместимый цикл обработки сообщений).
У меня вопрос, верны ли эти предположения?