Çok katmanlı bir .Net 4.5 uygulamam var async
ve C # 'ın yeni ve await
kilitlenen anahtar sözcüklerini kullanarak bir yöntemi çağırıyor ve nedenini göremiyorum.
En altta, veritabanı yardımcı programımızı genişleten bir zaman uyumsuz yöntemim var OurDBConn
(temelde temel DBConnection
ve DBCommand
nesneler için bir sarmalayıcı ):
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;
}
Ardından, yavaş çalışan toplamları almak için bunu çağıran orta düzey bir zaman uyumsuz yöntemim var:
public static async Task<ResultClass> GetTotalAsync( ... )
{
var result = await this.DBConnection.ExecuteAsync<ResultClass>(
ds => ds.Execute("select slow running data into result"));
return result;
}
Son olarak, senkronize olarak çalışan bir UI yöntemim (bir MVC eylemi) var:
Task<ResultClass> asyncTask = midLevelClass.GetTotalAsync(...);
// do other stuff that takes a few seconds
ResultClass slowTotal = asyncTask.Result;
Sorun şu ki, sonsuza dek o son satırda asılı kalması Ararsam da aynı şeyi yapar asyncTask.Wait()
. Yavaş SQL yöntemini doğrudan çalıştırırsam yaklaşık 4 saniye sürer.
Beklediğim davranış şudur ki asyncTask.Result
, eğer bitmemişse, bitene kadar beklemesi ve bir kez olduğunda sonucu geri vermesi gerekir.
Bir hata ayıklayıcı ile adım atarsam, SQL ifadesi tamamlanır ve lambda işlevi biter, ancak return result;
satırına GetTotalAsync
asla ulaşılmaz.
Neyi yanlış yaptığım hakkında bir fikrin var mı?
Bunu düzeltmek için araştırmam gereken yerlere dair herhangi bir öneriniz var mı?
Bu bir yerlerde bir çıkmaz olabilir mi ve öyleyse, onu bulmanın doğrudan bir yolu var mı?
SynchronizationContext
.