亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

哪個層應該在 .NET 中的 N 層架構模式中填充并發和任務

哪個層應該在 .NET 中的 N 層架構模式中填充并發和任務

C#
哈士奇WWW 2022-10-23 16:42:47
如果這個問題離題,您可以在評論中寫下稍后將其刪除:)如果我有 3 層(*.DLL 的)數據訪問層.DLL業務邏輯層.DLLUI 應用程序(WPF、WinForms、任何技術)在我的應用程序中,我讓 BusinessLogicLayer 方法返回Task,在 UI 應用程序中,當我使用來自 BusinessLogicLayer 的方法時,我調用 await我有以下誤解:Task 或并發應該支持哪一層(Back-End、Middle-were、Front)如果我需要為其他開發人員制作可重用的 BusinessLogicLayer,他們也可能忘記在處理他們的下一個項目中使用 UI 應用程序層中的等待/異步方法。如何在中間層實現等待方法,無需在每個 UI 事件(例如 Button_Click)中編寫等待。如何使 DataAccessLayer 只包含并發和在 UI 層中等待,而不需要使用await、async關鍵字。我的簡單代碼包含以下內容:DataAccessLayer.DLL單一方法public void MoveNext(){    if (RecordCount == 0) return;    Tables[0].Query.Criteria.Clear();    Tables[0].Query.Sorting = $"ORDER BY {string.Join(" ASC, ",     Tables[0].Keys.Select(x => x.KeyID))} ASC";    FetchDataBuffer();}BusinessLogicLayer.DLL現在以簡單的方式包裝了數據訪問的方法public Task MoveNext() => Task.Run(() => { EntryBase.MoveNext(); });UI 層(.NET 中的任何應用程序或前端提供程序) private async void BtnNext_ItemClick(object sender, ClickEventArgs e) {    await EntryLogic.MoveNext();    DeserializeBuffer(); }如上所示,在并發方法 ( MoveNext ) 完成之前, DeserializeBuffer方法不會執行。我需要做的是擺脫UI 層中的 await關鍵字和異步。我實際上做的是失敗,不知道為什么會這樣我嘗試制作的場景如下:將 DataAccessLayer 的方法類型從void轉換為Task   public Task MoveNext()   {      return Task.Run(() => {       if (RecordCount == 0) return;      Tables[0].Query.Criteria.Clear();      Tables[0].Query.Sorting = $"ORDER BY {string.Join(" ASC, ",       Tables[0].Keys.Select(x => x.KeyID))} ASC";      FetchDataBuffer();      });     }然后在中間層BusinessLogicLayer中調用await公共異步無效 MoveNext() => 等待 EntryBase.MoveNext();之后從邏輯層調用 UI 層中的 MoveNext。我想這會使它可以等待,因為它已經在中間層聲明了等待。但實際上 UI 層同時執行下一個方法。所以拋出的異常是因為關閉下一個方法(DeserializeBuffer)取決于上一個方法(EntryLogic.MoveNext)  private async void BtnNext_ItemClick(object sender, ClickEventArgs e)  {    EntryLogic.MoveNext();    DeserializeBuffer();  // exception thrown        /* because EntryLogic.MoveNext      is still executing and not awaited */  }任何幫助,將不勝感激。
查看完整描述

1 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

我需要做的是擺脫 UI 層中的 await 關鍵字和異步。

這是完全錯誤的。UI 層是唯一必須async使用的地方。而且它們確實必須在該層中使用。await

您的數據訪問技術未指定,但從代碼來看,我猜它可能是DataTable基于 - 的,這是有問題的,因為DataTable它非常舊并且不支持async. 請注意,使用“使它們異步”包裝方法主體Task.Run是一種反模式- 這些實際上是偽異步方法,而不是真正的異步。

如果我錯了并且您的數據訪問技術確實支持async,那么您應該能夠在async不使用Task.Run. 從最低級別開始(例如,FetchDataBuffer調用任何方法)并將它們更改為異步等效項。然后讓async從那里成長。請注意,“讓異步增長”意味著使用async Task,而不是async voidasync 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 應用程序之外的使用受到限制。


查看完整回答
反對 回復 2022-10-23
  • 1 回答
  • 0 關注
  • 116 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號