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