Я читал об асинхронном/ожидании и когда Task.Yield
мог быть полезен и наткнулся на этот пост. У меня возник вопрос относительно ниже этого сообщения:
Когда вы используете async/wait, нет гарантии, что метод, который вы используете вызов, когда вы ожидаете
FooAsync()
, будет выполняться асинхронно. Внутренняя реализация может свободно возвращаться, используя полностью синхронный путь.
Это немного непонятно для меня, вероятно, потому, что определение асинхронности в моей голове не выстраивается.
На мой взгляд, поскольку в основном я использую UI dev, асинхронный код - это код, который не запускается в потоке пользовательского интерфейса, а в другом потоке. Я предполагаю, что в тексте, который я цитировал, метод не является действительно асинхронным, если он блокирует любой поток (даже если это поток потока потока, например).
Вопрос:
Если у меня длинная работа, связанная с ЦП (скажем, она делает много жесткой математики), то выполнение этой задачи асинхронно должно блокировать некоторые потоки правильно? Что-то должно на самом деле делать математику. Если я жду этого, то поток будет заблокирован.
Что такое пример асинхронного метода и как они будут работать? Являются ли они ограниченными для операций ввода-вывода, которые используют некоторые аппаратные возможности, поэтому нить никогда не блокируется?