我有這個方法應該只回傳一個 Project 物件。IntelliSense 告訴我更新它以回傳 Task<List> 但是我必須更改屬性的宣告(我想確認只回傳一個專案,因此 .Result.First() 但是我收到一條錯誤訊息,指出 Project 不可等待。
public async Task<Project> GetProjectDataAsync(int projectId)
{
return await _db.LoadData<Project, dynamic>("dbo.Sp_Get_Project_Data_By_ProjectId",
new { projectId },
ConnectionStringName,
true).Result.First();
}
這是電話:
public Project Project { get; set; }
public async Task OnGetAsync(int projectId)
{
Project = await _db.GetProjectDataAsync(projectId);
}
如果值得注意的話,我正在使用 Dapper 連接到具有以下 LoadData 定義的 DB:
public async Task<List<T>> LoadData<T, U>(string sqlStatement, U parameters, string connectionStringName, bool isStoredProcedure = false)
{
string connectionString = _config.GetConnectionString(connectionStringName)!;
CommandType commandType = CommandType.Text;
if (isStoredProcedure == true)
{
commandType = CommandType.StoredProcedure;
}
using (IDbConnection connection = new SqlConnection(connectionString))
{
var rows = await connection.QueryAsync<T>(sqlStatement, parameters, commandType: commandType);
return rows.ToList();
}
}
uj5u.com熱心網友回復:
擺脫.Result電話。它本質上是試圖使異步操作同步。(然后.First()確實是不可等待的。)
可等待的操作是_db.LoadData<Project, dynamic>(...),例如:
var data = await _db.LoadData<Project, dynamic>(
"dbo.Sp_Get_Project_Data_By_ProjectId",
new { projectId },
ConnectionStringName,
true
);
return data.First();
或者,如果您想在一行中執行此操作,則仍然await呼叫LoadData該操作并將該操作包裝在括號中:
return (await _db.LoadData<Project, dynamic>(
"dbo.Sp_Get_Project_Data_By_ProjectId",
new { projectId },
ConnectionStringName,
true
)).First();
uj5u.com熱心網友回復:
awaitfirst的結果,LoadData然后獲取串列的第一個元素:
public async Task<Project> GetProjectDataAsync(int projectId)
{
var result = await _db.LoadData<Project, dynamic>("dbo.Sp_Get_Project_Data_By_ProjectId",
new { projectId },
ConnectionStringName,
true);
return result.First();
}
或者通過將 awaiting of LoadDatacall 括在括號中:
public async Task<Project> GetProjectDataAsync(int projectId)
{
return (await _db.LoadData<Project, dynamic>("dbo.Sp_Get_Project_Data_By_ProjectId",
new { projectId },
ConnectionStringName,
true)).First();
}
Task<TResult>.Result應避免在異步代碼中使用(除非您確定任務已經完成):
this 的結果值,
Task<TResult>與任務的 type 引數型別相同。
訪問屬性的 get 訪問器會阻塞呼叫執行緒,直到異步操作完成;相當于呼叫Wait方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/471675.html
上一篇:Angular11:使canDeactivate可觀察等待嵌套函式
下一篇:如何從每個渲染的元素呼叫api
