Обычно да, но есть как минимум одно исключение, о котором я могу подумать.Чтобы инициировать асинхронную операцию, вы должны передать операцию вне контекста вызывающей стороны.Под этим я подразумеваю, что вызывающая сторона не должна блокировать ожидание завершения операции.То, что обычно означает, что операция должна быть перемещена во вновь созданный поток, поток из ThreadPool
, порт завершения ввода-вывода, другой процесс или тому подобное.
Я сказал тамбыло одно исключение, которое пришло на ум.Если мы слегка извращаем наше определение асинхронности, мы можем допустить сценарии, в которых инициатор не блокирует ожидание завершения операции без фактического перемещения операции в другой поток.Лучший пример этого - насос сообщений интерфейса пользователя.В .NET достаточно просто вызвать Control.BeginInvoke
из самого потока пользовательского интерфейса, чтобы опубликовать выполнение делегата в том же потоке.Очевидно, что инициатор не будет блокировать ожидание завершения делегата, и все же делегат в конечном итоге начнет выполняться в том же потоке.Это определенно извращение того, что мы обычно думаем о термине асинхронный, потому что в этом сценарии операция блокируется до тех пор, пока вызывающая сторона не завершит работу, а не наоборот.