1 回答

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
我需要做的是擺脫 UI 層中的 await 關(guān)鍵字和異步。
這是完全錯(cuò)誤的。UI 層是唯一必須async
使用的地方。而且它們確實(shí)必須在該層中使用。await
您的數(shù)據(jù)訪問技術(shù)未指定,但從代碼來看,我猜它可能是DataTable
基于 - 的,這是有問題的,因?yàn)?code>DataTable它非常舊并且不支持async
. 請(qǐng)注意,使用“使它們異步”包裝方法主體Task.Run
是一種反模式- 這些實(shí)際上是偽異步方法,而不是真正的異步。
如果我錯(cuò)了并且您的數(shù)據(jù)訪問技術(shù)確實(shí)支持async
,那么您應(yīng)該能夠在async
不使用Task.Run
. 從最低級(jí)別開始(例如,FetchDataBuffer
調(diào)用任何方法)并將它們更改為異步等效項(xiàng)。然后讓async
從那里成長(zhǎng)。請(qǐng)注意,“讓異步增長(zhǎng)”意味著使用async Task
,而不是async void
; async void
在 BLL 中絕對(duì)是一種反模式。
但是,如果我是對(duì)的并且您的 DAL 正在使用DataTable
,那么您需要決定是否切換到更新的數(shù)據(jù)訪問技術(shù)。如果這不是您現(xiàn)在可以做的事情,那么我建議保留現(xiàn)有的 DAL 和 BLL 代碼,并將async
/添加await
到 UI 層:
private async void BtnNext_ItemClick(object sender, ClickEventArgs e)
{
await Task.Run(() => EntryLogic.MoveNext());
DeserializeBuffer();
}
這不是反模式,因?yàn)槲覀兪褂肨ask.Run的是調(diào)用方法——將其移出 UI 線程。這并不理想,因?yàn)槲覀內(nèi)栽谑褂帽缺匾嗟木€程,但理想的解決方案需要真正的異步數(shù)據(jù)訪問。通過這種妥協(xié),您的 DAL 和 BLL 仍然處于阻塞狀態(tài),因此它們?cè)谧烂?UI 應(yīng)用程序之外的使用受到限制。
- 1 回答
- 0 關(guān)注
- 103 瀏覽
添加回答
舉報(bào)