1 回答
TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
對于這個(gè)場景,我使用 aTaskCompletionSource<bool>作為一種高級事件。它具有Task可直接等待的屬性。然后,您可以從接收消息的類中調(diào)用SetResult(true)來完成任務(wù)并允許等待者繼續(xù)。
請注意,類型bool是無關(guān)緊要的:任務(wù)必須具有某種結(jié)果類型,但在這里我們只是將其用作表示事件已發(fā)生的信號方式(也就是說,我們實(shí)際上只想要 a 等待,而不是Taska Task<T>) 。
編輯以響應(yīng)OP的編輯:
是的,這是完全異步的。該await關(guān)鍵字使 C# 編譯器將控制器的代碼分解為多個(gè)部分,因此后面的部分成為await可以稍后恢復(fù)的“延續(xù)”。它將延續(xù)添加到任務(wù)的完成處理程序列表中,然后放棄線程;控制器方法不再執(zhí)行,因此不會耗盡線程/堆棧。
在您調(diào)用的類中SetResult,這實(shí)際上會導(dǎo)致任務(wù)通知(執(zhí)行)處理程序,從而導(dǎo)致控制器的代碼喚醒并完成。無需創(chuàng)建額外的線程;現(xiàn)有的被使用,并且一旦沒有立即要做的工作就被放棄。
- 1 回答
- 0 關(guān)注
- 138 瀏覽
添加回答
舉報(bào)
