আমার কাছে একটি বহু-স্তর রয়েছে। নেট 4.5 অ্যাপ্লিকেশনটিতে সি # এর নতুন asyncএবং awaitকীওয়ার্ড যা কেবলমাত্র স্তব্ধ হয়ে থাকে তা ব্যবহার করে একটি পদ্ধতি কল করে এবং কেন তা দেখতে পাচ্ছি না।
নীচে আমার একটি অ্যাসিঙ্ক পদ্ধতি রয়েছে যা আমাদের ডাটাবেস ইউটিলিটিটি 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;
}
তারপরে আমার কাছে মাঝারি স্তরের অ্যাসিঙ্ক পদ্ধতি রয়েছে যা কিছু ধীর গতিতে চলতে মোট যোগ দিতে এটিকে কল করে:
public static async Task<ResultClass> GetTotalAsync( ... )
{
var result = await this.DBConnection.ExecuteAsync<ResultClass>(
ds => ds.Execute("select slow running data into result"));
return result;
}
অবশেষে আমার কাছে একটি ইউআই পদ্ধতি আছে (একটি এমভিসি অ্যাকশন) যা সুসংগতভাবে চলে:
Task<ResultClass> asyncTask = midLevelClass.GetTotalAsync(...);
// do other stuff that takes a few seconds
ResultClass slowTotal = asyncTask.Result;
সমস্যাটি এটি চূড়ান্তভাবে শেষ পংক্তিতে ঝুলে থাকে। আমি ফোন করলে এটি একই কাজ করে asyncTask.Wait()। আমি যদি ধীর এসকিউএল পদ্ধতিটি সরাসরি চালাই তবে এটি প্রায় 4 সেকেন্ড সময় নেয়।
আমি যে আচরণটি প্রত্যাশা করছি তা হ'ল এটি যখন হয়ে যায়, asyncTask.Resultএটি শেষ না হলে এটি হওয়া অবধি অপেক্ষা করা উচিত এবং এটি একবার হলে ফলাফলটি ফিরে আসা উচিত।
যদি আমি কোনও ডিবাগার দিয়ে এসকিউএল স্টেটমেন্টটি সম্পন্ন করি এবং ল্যাম্বদা ফাংশন শেষ হয়ে যায় তবে return result;লাইনটি GetTotalAsyncকখনই পৌঁছায় না।
আমি কি ভুল করছি কোন ধারণা?
এটি ঠিক করার জন্য আমার তদন্তের প্রয়োজন যেখানে কোনও পরামর্শ?
এটি কি কোথাও অচলাবস্থা হতে পারে এবং যদি তাই হয় তবে এটির সন্ধানের কোনও সরাসরি উপায় আছে কি?
SynchronizationContext।