1 回答

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 等待,而不是Task
a Task<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)有立即要做的工作就被放棄。
- 1 回答
- 0 關(guān)注
- 116 瀏覽
添加回答
舉報(bào)