我有一個 ASP.NET API,它公開了一些資料庫操作。DB API 本身是同步的,無法更改。我知道在 ASP.NET 中使用 Task.Run 是一個壞主意,我打算使 Web API 同步,但開始考慮使資料庫操作異步的不同可能方法,并想知道這些是否是個好主意.
- 利用
Task.FromResult
[HttpGet]
public async Task<Result> Get()
{
return Task.FromResult(DBOperation());
}
這感覺就像Task除了結果之外只分配是好的。
- 利用
ValueTask
return new ValueTask<Result>(DBOperation());
感覺和任務一樣(只是分配更多)?不確定 ValueTask 是 struct 是好是壞。
- 利用
TaskCompletionSource
public Task<Result> DBOperation()
{
TaskCompletionSource<Result> tcs = new TaskCompletionSource<Result>();
//db call
tcs.SetResult(<result>);
return tcs.Task;
}
不確定它是否有幫助。
- 利用
Task.Yield
public Task<Result> DBOperation()
{
await Task.Yield();
//db call
}
或許?
你怎么認為?
uj5u.com熱心網友回復:
想知道這些是否是個好主意。
不。
在 ASP.NET 上進行異步同步的每次嘗試都會導致額外的記憶體開銷。其中一些(Task.Run和Task.Yield)還會導致額外的執行緒切換。
異步代碼的全部意義在于釋放執行緒,但如果你有一個不可避免的阻塞呼叫,那么根據定義,執行緒就不能被釋放。正如 Panagiotis 指出的那樣,您也許可以用異步呼叫替換阻塞呼叫,但如果不能,那么異步同步對您沒有幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/415676.html
標籤:
上一篇:如何根據嚴格條件查詢相關表
