Я читал о новых операторах async
и await
на С# и пытался выяснить, в каких обстоятельствах они могут быть полезны для меня. Я изучил несколько статей 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
не означает многопоточность, но вместо этого используется свободное время потока пользовательского интерфейса; при использовании консольного приложения или потока с определяемой пользователем точкой входа потребуется многопоточность для выполнения асинхронных операций (если не используется совместимый цикл сообщений).
Мой вопрос в том, являются ли эти предположения точными?