ฉันมีหลายชั้นสุทธิ 4.5 โปรแกรมประยุกต์ที่เรียกวิธีการใช้ C # 's ใหม่asyncและawaitคำหลักที่เพิ่งแฮงค์และผมก็ไม่สามารถดูว่าทำไม
ที่ด้านล่างฉันมีวิธีการ async ที่ขยายยูทิลิตี้ฐานข้อมูลของเราOurDBConn(โดยทั่วไปจะเป็น wrapper สำหรับพื้นฐาน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ทุกประการเนื่องจาก ASP.NET