1 回答

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