簡體   English   中英

我可以在 .NET Core SignalR 中省略 Clients.All.SendAsync() 的“等待”嗎?

[英]Can I omit “await” of Clients.All.SendAsync() in .NET Core SignalR?

        public async Task GetLiveCandleStick(string param)
        {
            await Clients.All.SendAsync("ReceiveMessage", param);
        }

請考慮上面的代碼。

幾乎所有教程都在await Clients.xxx.SendAsync方法。 但是,我發現即使我去掉了await關鍵字,它也能正常工作。 那么使用await有什么意義呢? (我看到一個線程解釋說await並不意味着“等到客戶端收到消息......”)

提前致謝。

僅在這種情況下,您不需要使用await - 在SendAsync之后沒有其他任何事情發生,因此無需等待。 GetLiveCandleStick上等待的行為與在SendAsync上等待的行為相同。 您可以將此方法轉換為:

public Task GetLiveCandleStick(string param)=> Clients.All.SendAsync("ReceiveMessage", param);

教程使用await因為在SendAsync之后經常代碼,應該在 SignalR 將消息入隊之后執行。

例如,您可能希望添加錯誤處理以防 SignalR 拋出,或者確保在緊密循環中的End消息之后將Begin消息排入隊列。 即使對於單個語句方法也有await對於調試也很有用。

最后,好的教程不應該引入不相關的概念,因為這很容易導致混淆。 SignalR 教程不是解釋await state 機器的最佳場所,或者何時可以跳過await 不幸的是, docs.microsoft.com中的太多示例試圖將所有內容放在一個頁面中,從而導致相當多的混亂。

通過省略await關鍵字,該方法將變成一勞永逸; 這幾乎不是正確的做法,因為您無法知道Task已完成。

另一個問題是異常處理。 如果在調用SendAsync時發生異常,它會放置在Task上,而不是直接拋出,並且只會在不使用await的情況下進行垃圾收集。

話雖如此,如果您的GetLiveCandleStick方法是您建議的簡單包裝器,則簡單地從SendAsync返回Task而不是使用async創建新的任務會稍微更有效:

public Task GetLiveCandleStick(string param)
{
    return Clients.All.SendAsync("ReceiveMessage", param);
}

關鍵字“await”用於異步方法。 它比“等待”更聰明,它是異步等待。 這意味着在執行代碼期間等待消息的返回,直到需要使用結果。 所以你不必使用線程,在一行代碼中等待。 但是編譯器將等待放在右邊的 position 中,在這種情況下調用等待的方法是異步的。 所以 Clients.All.SendAsync 的等待功能失效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM