2016-09-19 4 views
1

Я все еще пытаюсь понять, как и когда использовать методы async в asp.net, и я мог бы задать несколько десятков вопросов об этом, но это поведение удивительно для меня ... из всего, что я прочитал, если я создаю метод async, но объявляю его как void, а затем не дожидаюсь его, по сути, вы просто запускаете этот асинхронный код в рабочем потоке, не повесившись, чтобы получить результат. то есть, пустота немедленно вернется к вызывающему абоненту, вызывающий будет заниматься этим бизнесом и потенциально завершить до того, как делает метод async. но в моем приложении .net, это определенно не так. У меня есть async void, который я вызываю из другого асинхронного метода, и хотя я не await, он блокирует потоки по async. что тут происходит?ASPNET Core и асинхронное выполнение

спасибо.

+0

Также я все еще играю с ним - и теперь я не могу заставить любую задачу запускать в фоновом режиме? – user2403744

ответ

7

Я все еще пытаюсь получить мою голову вокруг, как и когда использовать методы асинхронных в asp.net

Вы бы использовать их, когда:

  1. У вас есть асинхронная работа делать. Вообще говоря, это означает привязку ввода/вывода, а не привязанную к ЦП.
  2. Ваши бэкэнд весы. Например, это WebAPI, служба NoSQL, кластер SQL Server и т. Д. Если ваш сервер является единственным экземпляром SQL Server, он не масштабируется, и нет смысла использовать асинхронность на вашем веб-уровне.

это, по существу, как если бы вы просто побежал этот код асинхронной на рабочий поток

async void No. просто препятствует вызывающему абоненту определить, когда он будет завершен. Он по-прежнему работает в том же контексте, что и вызывающий, как и метод async Task.

резьба блоки на коде асинхронной

Вполне вероятно, что ваш «асинхронный» код фактически синхронный. Если он не имеет await, тогда компилятор предупредит вас, что он синхронный.


Вы можете найти свой intro to async блоге и async on ASP.NET MSDN статью полезной. Что касается async, то ASP.NET Core только изменил пару вещей: 1) Контекст запроса ASP.NET больше нет, и 2) весь конвейер совместим с асинхронным, поэтому такие вещи, как асинхронные фильтры и компоненты просмотра async, просто работают.

+0

ОК, это здорово. я думаю, что меня выбрасывает, так это то, что я читал на ранней стадии, что «ждать» не имеет ничего общего с потоками, но, как я вижу, это не так: вы явно перемещаете работу в другой поток в какой-то момент если вы говорите, что текущий поток больше не блокируется, а ожидаемый выполняет. то есть ожидаемый выполняет в некотором потоке, а не тот, из которого он был вызван. так что я думаю, что некоторые потоки более ценны, чем другие, так сказать? как это на самом деле? – user2403744

+0

@ user2403744: Нет; для действительно асинхронного кода, [нет нити] (http://blog.stephencleary.com/2013/11/there-is-no-thread.html). –

+0

grrr, хорошо.Сегодня вечером я спустится через отверстие в кролике и убежу себя в том, что я уже знаю, чтобы быть правдой: вы правы. это заставит мой мозг больно, я просто знаю это. – user2403744

Смежные вопросы