簡體   English   中英

如何在TcpListener線程和主線程之間傳輸數據?

[英]How can I transfer data between a TcpListener thread and the main thread?

我有一個基於C#的套接字通信線程。 服務器中的緩沖區為1024字節,現在我需要一種在通信線程與主線程之間傳輸數據的方法。 我怎樣才能做到這一點? 我需要打開一個新的緩沖區,然后將數據復制到其中嗎? 還是可以僅從客戶端或服務器的緩沖區中獲取數據?

private void ServerResponse()
    {
        byte[] buff = new byte[1024];
        string msg;
        int len;
        try
        {
            if (!Stream.CanRead)
            {
                return;
            }

            stopFlag = false;
            while (!stopFlag)
            {
              len = Stream.Read(buff, 0, buff.Length);
                if (len < 1                    
                  {
                    Thread.Sleep(200);
                    continue;
               }
            }
       }
 }

上面是服務器用來從客戶端獲取數據的功能。 我的問題是我可以將該函數獲取的數據發送到主線程,還是應該在上面函數的定義之外設置一個新緩沖區,然后將數據復制到該緩沖區。

如果您的主線程通常是所謂的UI線程,那么本討論將為您提供一些想法: 如何使用后台工作程序更新GUI

您需要將收到的消息寫到主線程可訪問的緩沖區中。 您可以通過為每個接收到的消息創建一個新的緩沖區(字節數組)並將該緩沖區添加到ConcurrentQueue <>來實現此目的,這對於多線程讀取器/寫入器場景很有用。 這樣,您的偵聽線程會將接收到的消息寫入隊列,而您的主線程可以以線程安全的方式從同一隊列中讀取消息。

根據您的用例,您也許可以構建一個更有意義的對象(例如請求對象),並將其傳遞給主線程,而不是傳遞字節。

編輯:基於評論

假設您在公共范圍內定義了ConcurrentQueue<byte[]>

public ConcurrentQueue<byte[]> ReceivedMsgs = new ConcurrentQueue<byte[]>();

您可以在偵聽器線程中執行以下操作(將消息字節讀入buff ):

var msg = new byte[len];
Buffer.BlockCopy(buff, 0, msg, 0, len);
this.ReceivedMsgs.Enqueue(msg);

然后在主線程中,可以使消息出隊:

byte[] msg;
if (server.ReceivedMsgs.TryDequeue(out msg))
{
    //use msg
}

取決於需要如何將數據傳輸到主線程。 如果以字節為單位,則直接調用以下代碼。 如果不是,首先將數據轉換為可呈現的形式,然后調用代碼:

// Place this on the main thread's class initialization.
private static readonly SynchronizationContext _syncContext =
    SynchronizationContext.Current;

// Then your worked thread will be like this:
if (len < 1)                  
{
    Thread.Sleep(200);
    continue;
}
else
{
    _syncContext.Post(o => MainThreadClass.ReceiveData((byte[])buff), buff);
}

暫無
暫無

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

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