- Поднимите запрос 1.
- Поднимите запрос 2.
- Поднять запрос 3.
- Запрос 2 возвращает.
- Запрос 3 возвращает.
- Подождите ~20 секунд.
- Запрос 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