[英]Is it viable to use await/async and threads simultaneously on one method?
我是多線程技術的新手,我有一個(可能)關於同時使用線程和同時等待/異步的簡單問題。 我有一個讀取TCP流,然后處理它收到的響應的方法。 調用方式如下所示:
ThreadStart ts = new ThreadStart(ReadTCP);
Thread tt = new Thread(ts);
異步讀取流中的數據是否可行? 像下面的代碼:
private async void ReadTCP()
{
string responseData = string.Empty;
if(streamTCP.DataAvailable)
{
responseData = await readerTCP.ReadToEndAsync();
// some code handling the response
}
}
在MarioDS的幫助下編輯的代碼
手動創建和操作線程是一種高級多線程技術,它要求開發人員真正了解他在做什么(因為內存隔離,線程之間的同步和編組都是非常高級的主題,容易弄亂)。 線程安全性很難。
如果您想要的只是提高應用程序的響應能力,那么幾年前已添加到.NET的async和await構造是完美的。 它們不一定與多線程相關,因為它是決定是否創建新線程的基礎機制(並非總是如此)。
您正在做的是創建一個線程並在該線程上運行ReadTCP
方法。
您可以輕松地修復ReadTCP
,使其返回Task
( async void
確實是一種不好的做法!),然后像這樣使用它: var response = await ReadTCP();
在async
方法中,它將為您提供所需的內容。
要在同時運行ReadTCP
同時並行運行東西,請為任務創建一個變量,然后await
它:
var readTask = ReadTCP();
DoOtherStuff();
AndMoreStuff();
AllAtOnce();
var response = await readTask;
DoSomethingWith(response);
順便說一下,您不必在Task.Run
包裝異步方法。 而不是這樣做: Task.Run(() => FPXreaderTCP.ReadToEndAsync());
,只需await FPXreaderTCP.ReadToEndAsync()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.