मेरे पास एक बहु स्तरीय .Net 4.5 अनुप्रयोग है जो C # के नए async
और await
कीवर्ड का उपयोग करते हुए एक विधि को कॉल करता है जो बस लटका रहता है और मैं क्यों नहीं देख सकता।
नीचे मेरे पास एक async विधि है जो हमारे डेटाबेस उपयोगिता OurDBConn
(मूल रूप से अंतर्निहित DBConnection
और DBCommand
वस्तुओं के लिए एक आवरण ) का विस्तार करती है:
public static async Task<T> ExecuteAsync<T>(this OurDBConn dataSource, Func<OurDBConn, T> function)
{
string connectionString = dataSource.ConnectionString;
// Start the SQL and pass back to the caller until finished
T result = await Task.Run(
() =>
{
// Copy the SQL connection so that we don't get two commands running at the same time on the same open connection
using (var ds = new OurDBConn(connectionString))
{
return function(ds);
}
});
return result;
}
फिर मेरे पास एक मध्य स्तर की async विधि है जो कुछ धीमी गति से चलने वाले योग प्राप्त करने के लिए इसे कॉल करती है:
public static async Task<ResultClass> GetTotalAsync( ... )
{
var result = await this.DBConnection.ExecuteAsync<ResultClass>(
ds => ds.Execute("select slow running data into result"));
return result;
}
अंत में मेरे पास UI विधि (MVC क्रिया) है जो समकालिक रूप से चलती है:
Task<ResultClass> asyncTask = midLevelClass.GetTotalAsync(...);
// do other stuff that takes a few seconds
ResultClass slowTotal = asyncTask.Result;
समस्या यह है कि यह हमेशा के लिए उस अंतिम पंक्ति पर लटका रहता है। अगर मैं फोन करता हूं तो यह वही काम करता है asyncTask.Wait()
। अगर मैं धीमी SQL विधि को सीधे चलाता हूं तो लगभग 4 सेकंड लगते हैं।
मैं जिस व्यवहार की उम्मीद कर रहा हूं, वह यह है कि जब यह हो जाए asyncTask.Result
, अगर यह खत्म नहीं होता है तो इसे तब तक इंतजार करना चाहिए, और एक बार यह परिणाम वापस कर देना चाहिए।
अगर मैं डीबगर के साथ कदम रखता हूं तो SQL स्टेटमेंट पूरा हो जाता है और लैम्बडा फंक्शन खत्म हो जाता है, लेकिन return result;
लाइन GetTotalAsync
कभी नहीं पहुंचती।
किसी भी विचार मैं गलत क्या कर रहा हूँ?
इसे ठीक करने के लिए मुझे कहाँ जाँच करने की आवश्यकता है?
क्या यह कहीं गतिरोध हो सकता है, और यदि ऐसा है तो इसे खोजने का कोई सीधा तरीका है?
SynchronizationContext
।