Почему мой асинхронный контроллер веб-API ASP.NET блокирует основной поток?C#

Место общения программистов C#
Anonymous
Почему мой асинхронный контроллер веб-API ASP.NET блокирует основной поток?

Сообщение Anonymous »

У меня есть контроллер веб-API ASP.NET, который, как я думал, будет работать асинхронно. Контроллер предназначен для ожидания 20 секунд для первого запроса, но немедленно обслуживает все последующие запросы. Итак, мой предполагаемый график будет примерно таким:
  • Поднимите запрос 1.
  • Поднимите запрос 2.
  • Поднять запрос 3.
  • Запрос 2 возвращает.
  • Запрос 3 возвращает.
  • Подождите ~20 секунд.
  • Запрос 1 возвращается.
Вместо этого , нет запросов не возвращается, пока запрос 1 не будет завершен.

Я могу подтвердить (на основании результатов отладки), что входной поток и идентификатор спящего потока различаются. Я намеренно использовал TaskCreationOptions.LongRunning, чтобы перенести спящий режим в отдельный поток, но приложение все равно отказывается обслуживать любые новые запросы, пока этот спящий режим не завершится.

Могу ли я упустить что-то фундаментальное о том, как на самом деле работают асинхронные контроллеры веб-API?



public class ValuesController : ApiController
{
private static bool _firstTime = true;

public async Task Get()
{
Debug.WriteLine("Entry thread id: {0}. Sync: {1}",
Thread.CurrentThread.ManagedThreadId,
SynchronizationContext.Current);
await LongWaitAsync();
return "FOOBAR";
}

private Task LongWaitAsync()
{
return Task.Factory.StartNew(() =>
{
if (_firstTime)
{
_firstTime = false;
Debug.WriteLine("Sleepy thread id: {0}. Sync: {1}",
Thread.CurrentThread.ManagedThreadId,
SynchronizationContext.Current);
Thread.Sleep(20000);
Debug.WriteLine("Finished sleeping");
}
},
CancellationToken.None,
TaskCreationOptions.LongRunning,
TaskScheduler.Default);
}
}


Подробнее здесь: https://stackoverflow.com/questions/149 ... ain-thread

Вернуться в «C#»