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

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

使用 SemaphoreSlim 和 Dictionary 等待 NetMQ 回復(fù)

使用 SemaphoreSlim 和 Dictionary 等待 NetMQ 回復(fù)

C#
慕沐林林 2023-09-09 16:42:03
我有兩個(gè)應(yīng)用程序使用 NetMQ 相互通信。第一個(gè)應(yīng)用程序內(nèi)置了一個(gè) API 控制器,第二個(gè)應(yīng)用程序(引擎)在必要時(shí)與第一個(gè)應(yīng)用程序來(lái)回通信。所有 API 控制器函數(shù)都是異步任務(wù),因?yàn)槲覀兤谕瑫r(shí)發(fā)生許多請(qǐng)求。其中一個(gè) API 控制器函數(shù)需要首先向第二個(gè)應(yīng)用程序(引擎)發(fā)送 NetMQ 消息,并等待其響應(yīng),然后再將結(jié)果返回給 API 函數(shù)請(qǐng)求者(API 用戶)。它需要以異步方式完成所有這些,而不需要從線程池中獲取,因?yàn)檎缥抑八f(shuō),我們可能有大量請(qǐng)求不斷地訪問(wèn)此控制器。當(dāng) SemaphoreSlim 等待時(shí),第二個(gè)應(yīng)用程序(引擎)正在更新數(shù)據(jù)庫(kù)中特定記錄的狀態(tài),并且我需要在 API 控制器函數(shù)中讀取該記錄的狀態(tài)并將其返回給 API 用戶,如果我沒(méi)有 SemaphoreSlim 等待設(shè)計(jì),那么代碼當(dāng)然會(huì)提前讀取數(shù)據(jù)庫(kù)記錄并且不會(huì)返回正確的狀態(tài)。因此,解決方案是創(chuàng)建等待,允許引擎更新?tīng)顟B(tài),然后通知 API 控制器函數(shù)它可以從數(shù)據(jù)庫(kù)讀取新更新的狀態(tài)。一位同事告訴我,使用 SemaphoreSlim 和 Dictionary 設(shè)置通過(guò)鎖定在函數(shù)中創(chuàng)建等待,并且僅在收到來(lái)自引擎的 NetMQ 回復(fù)時(shí)才從字典中釋放 SemaphoreSlim。然后代碼自然會(huì)繼續(xù),我將檢查數(shù)據(jù)庫(kù)的更新?tīng)顟B(tài)并將其返回給 API 用戶。問(wèn)題在于 API 控制器函數(shù)完全忽略了 SemaphoreSlim 鎖并過(guò)早地從數(shù)據(jù)庫(kù)讀取。最有可能的是因?yàn)樗钱惒降?,所以我的?wèn)題是,如何使 SempahoreSlim 鎖定和讀取數(shù)據(jù)庫(kù)代碼以異步方式一起工作,而不鎖定線程?我相信代碼會(huì)讓您更好地理解我正在嘗試做的事情。1. API控制器部分功能代碼://Call EngineMessenging.Queue.Enqueue(OrderPositionText + " " + UserId + " " + AssetPairId + " " + OrderType + " " + OrderRequestId + " " + rAmount + " " + rPrice + " " + Stop);//Create SemaphoreSlim Lock and add it to global Dictionary     var NewSemaphore = new SemaphoreSlim(1, 1);await NewSemaphore.WaitAsync().ConfigureAwait(false);ApiHub.UserSemaphoreDictionary.TryAdd(UserId, NewSemaphore);//Lock was released lets now read record in Database then return appropriate result to API user.                Debug.WriteLine("Checking order status for " + uuid);                OrderRequest OrderRequestRec = await _context.OrderRequest.Where(x => x.UUID == uuid).FirstOrDefaultAsync();    if (OrderRequestRec != null)                    {                        Debug.WriteLine("ORDER STATUS: " + OrderRequestRec.Status);    }2.這是另一個(gè)類(lèi)中接收NetMQ消息并釋放SemaphoreSlim的代碼:                        //API Semaphore Release lock                        SemaphoreSlim checkUserId;                        if (ApiHub.UserSemaphoreDictionary.TryGetValue(UserId, out checkUserId)) {                            Debug.WriteLine("RELEASING LOCK: " + UserId);                            checkUserId.Release();                        }結(jié)果是先讀取Database,然后釋放SemaphoreSlim。我需要釋放 SemaphoreSlim,然后讀取數(shù)據(jù)庫(kù)。
查看完整描述

1 回答

?
慕婉清6462132

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊

對(duì)于這個(gè)場(chǎng)景,我使用 aTaskCompletionSource<bool>作為一種高級(jí)事件。它具有Task可直接等待的屬性。然后,您可以從接收消息的類(lèi)中調(diào)用SetResult(true)來(lái)完成任務(wù)并允許等待者繼續(xù)。

請(qǐng)注意,類(lèi)型bool是無(wú)關(guān)緊要的:任務(wù)必須具有某種結(jié)果類(lèi)型,但在這里我們只是將其用作表示事件已發(fā)生的信號(hào)方式(也就是說(shuō),我們實(shí)際上只想要 a 等待,而不是TaskTask<T>) 。

編輯以響應(yīng)OP的編輯:

是的,這是完全異步的。該await關(guān)鍵字使 C# 編譯器將控制器的代碼分解為多個(gè)部分,因此后面的部分成為await可以稍后恢復(fù)的“延續(xù)”。它將延續(xù)添加到任務(wù)的完成處理程序列表中,然后放棄線程;控制器方法不再執(zhí)行,因此不會(huì)耗盡線程/堆棧。

在您調(diào)用的類(lèi)中SetResult,這實(shí)際上會(huì)導(dǎo)致任務(wù)通知(執(zhí)行)處理程序,從而導(dǎo)致控制器的代碼喚醒并完成。無(wú)需創(chuàng)建額外的線程;現(xiàn)有的被使用,并且一旦沒(méi)有立即要做的工作就被放棄。


查看完整回答
反對(duì) 回復(fù) 2023-09-09
  • 1 回答
  • 0 關(guān)注
  • 116 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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