में एकाधिक प्रतीक्षा कार्यों के साथ लटक रहा है। नीचे दिए गए कोड का एक सरलीकृत संस्करण नीचे दिया गया है। जब मैं इसे कंसोल एप्लिकेशन में चलाता हूं, तो यह अपेक्षा के अनुसार काम करता है। सभी प्रश्न समानांतर में चलाए जाते हैं और Task.WaitAll()
लौटते हैं जब वे पूरी हो जाते हैं।कार्य। ASP.NET
हालांकि, जब यह कोड किसी वेब एप्लिकेशन में चलता है, तो अनुरोध केवल लटकता है। जब मैं एक डीबगर संलग्न करता हूं और सभी को तोड़ता हूं, तो यह दिखाता है कि निष्पादन Task.WaitAll()
पर प्रतीक्षा है। और पहला कार्य पूरा हो गया है, लेकिन अन्य कभी खत्म नहीं होते हैं।
मुझे पता नहीं लगा सकता कि यह ASP.NET में चलते समय क्यों लटकता है, लेकिन कंसोल एप्लिकेशन में ठीक काम करता है।
public Foo[] DoWork(int[] values)
{
int count = values.Length;
Task[] tasks = new Task[count];
for (int i = 0; i < count; i++)
{
tasks[i] = GetFooAsync(values[i]);
}
try
{
Task.WaitAll(tasks);
}
catch (AggregateException)
{
// Handle exceptions
}
return ...
}
public async Task<Foo> GetFooAsync(int value)
{
Foo foo = null;
Func<Foo, Task> executeCommand = async (command) =>
{
foo = new Foo();
using (SqlDataReader reader = await command.ExecuteReaderAsync())
{
ReadFoo(reader, foo);
}
};
await QueryAsync(executeCommand, value);
return foo;
}
public async Task QueryAsync(Func<SqlCommand, Task> executeCommand, int value)
{
using (SqlConnection connection = new SqlConnection(...))
{
connection.Open();
using (SqlCommand command = connection.CreateCommand())
{
// Set up query...
await executeCommand(command);
// Log results...
return;
}
}
}
+1। हालांकि मैं "मुख्य धागे" के बजाय "अनुरोध संदर्भ" शब्द का उपयोग करूंगा। –
@ स्टीफन क्लेरी हाँ, यह बहस योग्य था। मैंने उद्धरणों में मुख्य धागा लगाया क्योंकि यह पूरे एप्लिकेशन का मुख्य धागा नहीं है, लेकिन इसे "उस अनुरोध के मुख्य धागे" के रूप में माना जा सकता है। यह मेरे दिमाग में समस्या के बारे में सोचने का एक उपयोगी तरीका है। – Servy
एक महत्वपूर्ण चेतावनी यह है कि कार्य का इंतजार है। जब सभी कुल अपवाद नहीं फेंकेंगे; आंतरिक अपवादों में से केवल एक ही प्रचारित किया जाएगा। यदि आप संपूर्ण समेकन अपवाद की जांच करना चाहते हैं, तो आपको कार्य से लौटे हुए कार्य का संदर्भ संग्रहीत करना होगा। जब भी और इसकी अपवाद संपत्ति की स्पष्ट रूप से जांच करें। –