相對較新的WebAPI和異步所以請容忍我所說的「正常」的靜態方法....我可以從一個異步API控制方法
我有一些在其操作的應用程序的WebAPI。實質上,這些調用SQL Server存儲過程。
已經工作正常,但我期待,使通過轉換方法是異步更高效和穩健。
讓我告訴一個基法 - 因爲他們都是相似....
舊版本
[System.Web.Http.HttpGet]
public A_Class MyAPIMethod(Guid b)
{
using (SqlConnection DB = new SqlConnection(this.dbConnString))
{
return MyStaticHelper.A_Static_Method(DB, b);
}
}
新版本(異步我認爲&希望)
[System.Web.Http.HttpGet]
public async Task<A_Class> MyAPIMethodAsync(Guid b)
{
var db = new SqlConnection(this.dbConnString);
try
{
var Result = await Task.Run(() => MyStaticHelper.A_Static_Method(db, b));
return Result;
}
finally
{
db.Dispose();
}
}
我想這一點是確定的 - 我只是不知道什麼,如果有什麼我需要做我的靜態輔助方法。 我是否需要將其轉換爲異步? 我已經打電話給這個,這一切似乎都行得通 - 我可以做一個完整性檢查請。 讚賞任何建議....
靜態輔助方法....
public static A_Class A_Static_Method(SqlConnection dbConn, Guid A_Param)
{
SqlDataReader reader = null;
try
{
try
{
if (dbConn.State != ConnectionState.Closed) dbConn.Close();
using (var cmd = new SqlCommand("MyStoredProc", dbConn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@sp_Param", SqlDbType.UniqueIdentifier).Value = A_PAram
dbConn.Open();
reader = cmd.ExecuteReader();
var A_Class = StaticFunctionToGetInstanceOfClassFromResults(reader);
A_Class.rc = 1;
return A_Class
}
}
catch (Exception)
{
//server error
return new A_Class(A_ClassError.beApiError);
}
}
finally
{
if (reader != null) reader.Close();
dbConn.Close();
}
}
爲什麼你認爲在另一個線程上運行該方法並等待結果比同步運行更「高效且健壯」?想象一下,我克隆了你並要求你做一些事情。爲什麼要讓克隆人完成任務並等待它完成比只是自己完成任務更好? –
@Daniel Kelley說得很好。 AntDC,異步編程有開銷,應該根據需要使用,而不僅僅是使用它。在這種情況下,因爲你在這裏所做的只是運行一個存儲過程,所以沒有必要。如果這是一個長期運行的程序,我會從那裏開始,並考慮讓它更有效率。我也不建議在靜態類中有任何保持狀態的數據庫連接。 –
我沒有明說我們這個相對較新的給我.... 我想不會阻塞線程作爲我的API可能有大量的併發請求的.... 無論如何,所以怎麼樣,如果我不得不從我的API調用外部API。 異步操作會更適用嗎? 此外,dbConnString是我的BaseController類的一個屬性,我將它傳遞給我的靜態方法。 – AntDC