在過去的幾個月中,我一直在閱讀關於C#中的異步等待以及如何正確使用它。如何在新線程上運行任務並立即返回給調用者?
爲了實驗練習的目的,我正在構建一個小型的Tcp服務器,它應該爲連接它的客戶端提供服務。該程序是一個控制檯應用程序。
我使用while循環來等待連接,像這樣:
while (!_isStopRequested)
{
TcpClient client = await _tcpListener.AcceptTcpClientAsync();
await Task.Factory.StartNew(() => ProcessClientAsync(client), TaskCreationOptions.LongRunning);
}
所以,到現在爲止我做的方法ProcessClientAsync標記爲異步作廢,我只是把它ProcessClientAsync(客戶端)和呼叫會立即返回給調用者。 但是我在網上看到,除非是事件,否則使用它是一個糟糕的決定。 所以我將定義更改爲異步任務。
好的,但沒有等待,我在Visual Studio中收到警告「因爲這個調用沒有被等待,當前的方法在調用完成之前繼續運行」。
一旦我使用了ProcessClientAsync(客戶端),代碼就無法工作。我只能連接一個客戶端,然後調用者「等待」ProcessClientAsync返回。但是,該方法具有無限循環並且不會返回,但我需要while循環來繼續處理下一個客戶端。
谷歌搜索,我想出了這個主題: How to safely call an async method in C# without await
我猜問題是大同小異的,只是當我使用等待ProcessClientAsync,我希望它立即返回給調用者,它沒有按」我知道,因爲運行第二個客戶端,而第一個仍在運行,第二個客戶端不連接。
所以我這樣做:
await Task.Factory.StartNew(() => ProcessClientAsync(client), TaskCreationOptions.LongRunning);
但由於ProcessClientAsync必須返回一個任務,我不知道這是否是好的呢?
這將是一個問題。
另一個問題是:我怎樣才能調用一個永久運行的異步Task方法,並立即將調用返回給調用者,這樣while循環可以繼續,並且tcp偵聽器可以繼續接受下一個客戶端?
謝謝。
對不起,如果是重複,或不清楚我在問什麼。
請縮小你的問題:它過於寬泛。另外,爲了更好的可讀性,做一些編輯,排除非必要部分。感謝和問候, –