Почему этот асинхронный / ожидающий код не блокируется - PullRequest
0 голосов
/ 01 февраля 2019

Я читаю эту статью о взаимоблокировке, и я попытался использовать свой собственный код, и у него нет проблемы с взаимоблокировкой.Почему это так?

Я ожидаю:

  1. GetJsonAsync заканчивает ждать и вот-вот вернется jsonString

  2. Main выполняет jsonTask.Result и удерживает контекст

  3. GetJsonAsync хочет вернуть jsonString до тех пор, пока контекст не станет доступен

  4. тупикпроизойдет

        public static void Main(string[] args)
        {
            var jsonTask = GetJsonAsync();
            int i = jsonTask.Result;
            Console.WriteLine(jsonTask.Result);
        }
    
        public static async Task<int> GetJsonAsync()
        {
            var jsonString = await ReturnIntAsync();
            return jsonString;
        }
    
        public static async Task<int> ReturnIntAsync()
        {
            int i = 0;
            await Task.Run(() => i++);
            return i;
        }
    

1 Ответ

0 голосов
/ 01 февраля 2019

Это не тупик, потому что нет синхронизации SynchronizationContext, поэтому метод async возобновляет выполнение в потоке пула потоков, а не в главном потоке.

Соответствующие цитаты из статьи (выделение добавлено):

Вот ситуация: помните из моего вступительного поста, что после того, как вы дождетесь Задачи, когда метод продолжится, он продолжится в контексте.

В первом случае этот контекстявляется контекстом пользовательского интерфейса (который применяется к любому пользовательскому интерфейсу , кроме консольных приложений ).Во втором случае этот контекст является контекстом запроса ASP.NET ...

Для примера пользовательского интерфейса «контекст» - это контекст пользовательского интерфейса;для примера ASP.NET «контекст» - это контекст запроса ASP.NET.Этот тип взаимоблокировки может быть вызван для любого «контекста».

Если вы действительно хотите заблокировать консольное приложение таким образом, вы можете использовать AsyncContext из моей библиотеки AsyncEx для установки однопоточного контекста в основной поток вашего Консольного приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...