0

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;
               }
            }
       }
 }

上記は、サーバーがクライアントからデータを取得するために使用する関数です。私の質問は、この関数が取得したデータをメインスレッドに送信するか、上記の関数の定義の外に新しいバッファを設定してデータをコピーすることです。

4

3 に答える 3

0

あなたのメイン スレッドが通常 UI スレッドと呼ばれるものである場合、この議論はいくつかのアイデアを与えてくれます:バックグラウンド ワーカーで GUI を更新する方法

于 2012-06-13T06:19:38.933 に答える
0

受信したメッセージを、メイン スレッドからアクセスできるバッファに書き込む必要があります。これを行うには、受信したメッセージごとに新しいバッファー (バイト配列) を作成し、そのバッファーをConcurrentQueue<>に追加します。これは、マルチスレッド リーダー/ライター シナリオに適しています。このようにして、リスニング スレッドは受信したメッセージをキューに書き込み、メイン スレッドは同じキューからメッセージをスレッド セーフな方法で読み取ることができます。

ユース ケースによっては、より意味のあるオブジェクト (リクエスト オブジェクトなど) を作成し、バイトを渡す代わりにそれをメイン スレッドに渡すことができる場合があります。

編集:コメントに基づく

ConcurrentQueue<byte[]>パブリック スコープで aを定義したと仮定します。

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
}
于 2012-06-13T06:21:31.540 に答える
0

データをメインスレッドに転送する方法によって異なります。バイト単位の場合は、次のコードを直接呼び出してください。そうでない場合は、まずデータを表示可能な形式に変換してから、コードを呼び出します。

// 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);
}
于 2012-06-13T06:24:55.340 に答える