第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

哪個(gè)層應(yīng)該在 .NET 中的 N 層架構(gòu)模式中填充并發(fā)和任務(wù)

哪個(gè)層應(yīng)該在 .NET 中的 N 層架構(gòu)模式中填充并發(fā)和任務(wù)

C#
哈士奇WWW 2022-10-23 16:42:47
如果這個(gè)問題離題,您可以在評(píng)論中寫下稍后將其刪除:)如果我有 3 層(*.DLL 的)數(shù)據(jù)訪問層.DLL業(yè)務(wù)邏輯層.DLLUI 應(yīng)用程序(WPF、WinForms、任何技術(shù))在我的應(yīng)用程序中,我讓 BusinessLogicLayer 方法返回Task,在 UI 應(yīng)用程序中,當(dāng)我使用來自 BusinessLogicLayer 的方法時(shí),我調(diào)用 await我有以下誤解:Task 或并發(fā)應(yīng)該支持哪一層(Back-End、Middle-were、Front)如果我需要為其他開發(fā)人員制作可重用的 BusinessLogicLayer,他們也可能忘記在處理他們的下一個(gè)項(xiàng)目中使用 UI 應(yīng)用程序?qū)又械牡却?異步方法。如何在中間層實(shí)現(xiàn)等待方法,無需在每個(gè) UI 事件(例如 Button_Click)中編寫等待。如何使 DataAccessLayer 只包含并發(fā)和在 UI 層中等待,而不需要使用await、async關(guān)鍵字。我的簡(jiǎn)單代碼包含以下內(nèi)容: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現(xiàn)在以簡(jiǎn)單的方式包裝了數(shù)據(jù)訪問的方法public Task MoveNext() => Task.Run(() => { EntryBase.MoveNext(); });UI 層(.NET 中的任何應(yīng)用程序或前端提供程序) private async void BtnNext_ItemClick(object sender, ClickEventArgs e) {    await EntryLogic.MoveNext();    DeserializeBuffer(); }如上所示,在并發(fā)方法 ( MoveNext ) 完成之前, DeserializeBuffer方法不會(huì)執(zhí)行。我需要做的是擺脫UI 層中的 await關(guān)鍵字和異步。我實(shí)際上做的是失敗,不知道為什么會(huì)這樣我嘗試制作的場(chǎng)景如下:將 DataAccessLayer 的方法類型從void轉(zhuǎn)換為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中調(diào)用await公共異步無效 MoveNext() => 等待 EntryBase.MoveNext();之后從邏輯層調(diào)用 UI 層中的 MoveNext。我想這會(huì)使它可以等待,因?yàn)樗呀?jīng)在中間層聲明了等待。但實(shí)際上 UI 層同時(shí)執(zhí)行下一個(gè)方法。所以拋出的異常是因?yàn)殛P(guān)閉下一個(gè)方法(DeserializeBuffer)取決于上一個(gè)方法(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貢獻(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 voidasync 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)用程序之外的使用受到限制。


查看完整回答
反對(duì) 回復(fù) 2022-10-23
  • 1 回答
  • 0 關(guān)注
  • 103 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)