मेरे पास एक एएसपी.नेट वेब एपीआई नियंत्रक है जो मेरे पास सोचा होगा असीमित रूप से संचालित होगा। नियंत्रक को पहले अनुरोध के लिए 20 सेकंड सोने के लिए डिज़ाइन किया गया है, लेकिन तुरंत बाद के अनुरोधों की सेवा करें।मेरा एसिंक एएसपी.NET वेब एपीआई नियंत्रक मुख्य धागा को अवरुद्ध क्यों कर रहा है?
- बढ़ाएं अनुरोध 1.
- बढ़ाएं अनुरोध 2.
- बढ़ाएं अनुरोध 3.
- अनुरोध 2 रिटर्न: तो मेरी प्रत्याशित समय की तरह कुछ होगा।
- अनुरोध 3 रिटर्न।
- प्रतीक्षा करें ~ 20 सेकंड।
- अनुरोध 1 रिटर्न।
इसके बजाय, कोई अनुरोध 1 तक समाप्त होने तक अनुरोध वापस आ गया है।
मैं पुष्टि कर सकता हूं (डीबग आउटपुट के आधार पर), कि प्रवेश थ्रेड और नींद थ्रेड आईडी अलग हैं। नींद को एक अलग थ्रेड पर मजबूर करने के लिए मैंने जानबूझकर TaskCreationOptions.LongRunning
का उपयोग किया है, लेकिन फिर भी एप्लिकेशन नींद समाप्त होने तक किसी भी नए अनुरोध की सेवा करने से इंकार कर देता है।
क्या मुझे एसिंक वेब एपीआई नियंत्रक वास्तव में कैसे काम करते हैं, इस बारे में कुछ मौलिक याद आ रही है?
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);
}
}
पहले चरण के रूप में, मैं यह सुनिश्चित करने के लिए '_firstTime' को' अस्थिर 'के रूप में चिह्नित करता हूं, यह सुनिश्चित करने के लिए कि अलग-अलग धागे इसे लगातार बदलते देख सकें। –
होस्ट करने के लिए आप किस वेब सर्वर का उपयोग कर रहे हैं? –
'फर्स्टटाइम' को 'अस्थिर' के रूप में चिह्नित करने से कोई फर्क नहीं पड़ता। मैंने विन 7 प्रो पर आईआईएस एक्सप्रेस 8.0 और आईआईएस 7.5 में होस्टिंग की कोशिश की है। – Snixtor