ฉันมีหลายชั้นสุทธิ 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