Mam kontrolera ASP.NET Web API, który miałbym , że będzie działać asynchronicznie. Kontroler jest przeznaczony do snu 20 sekund na pierwsze żądanie, ale natychmiast obsługuje kolejne żądania. Więc moje Przewiduje timeline byłoby coś takiego:Dlaczego mój asynchroniczny kontroler ASP.NET Web API blokuje główny wątek?
- Raise życzenie 1.
- prośba Podnieś 2.
- żądania Raise 3.
- życzenie 2 powroty.
- Żądanie 3 zwraca.
- Czekaj ~ 20 sekund.
- Żądanie 1 zwraca.
Zamiast tego, no żąda powrotu, aż żądanie 1 zostanie zakończone.
Mogę potwierdzić (na podstawie wyników debugowania), że wątek wejściowy i identyfikator wątku spoczynkowego są różne. Celowo użyłem TaskCreationOptions.LongRunning
, aby zmusić sen do oddzielnego wątku, ale mimo to aplikacja odmawia obsługi nowych żądań, dopóki ten sen się nie skończy.
Czy brakuje mi czegoś fundamentalnego o tym, jak naprawdę działają kontrolery Web API async?
public class ValuesController : ApiController
{
private static bool _firstTime = true;
public async Task<string> 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);
}
}
Pierwszym krokiem byłoby oznaczenie '_firstTime' jako' volatile', aby upewnić się, że oddzielne wątki mogą widzieć, że zmienia się konsekwentnie. –
Jakiego serwera internetowego używasz do hostowania? –
Oznaczenie '_firstTime' jako' volatile' nie ma znaczenia. Próbowałem już hostingu w IIS Express 8.0 i IIS 7.5, zarówno na Win 7 Pro. – Snixtor