簡體   English   中英

在一種方法中同時使用等待/異步和線程是否可行?

[英]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 ,使其返回Taskasync 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.

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