7

私のWPF4.0 アプリケーションでは、UDP以下に示すようにリスナーを実装しています。私の Windows 7 PC では、サーバーとクライアントの両方を で実行していますlocalhost

受信した各データグラムは、より大きなビットマップのスキャンラインであるため、すべてのスキャンラインが受信された後、ビットマップがUIスレッドに表示されます。これはうまくいくようです。ただし、1 ~ 50% のスキャンラインが欠落している場合があります。弱いネットワーク接続ではこれが予想されますが、ローカルで実行されている場合はそうではありません。

UDP次のコードでパッケージが失われる原因は何ですか?

IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, PORT);
udpClient = new UdpClient(endPoint);
udpClient.Client.ReceiveBufferSize = 65535; // I've tried many different sizes...

var status = new UdpStatus()
{
    u = udpClient,
    e = endPoint
};

udpClient.BeginReceive(new AsyncCallback(UdpCallback), status);

private void UdpCallback(IAsyncResult ar)
{
    IPEndPoint endPoint = ((UdpStatus)(ar.AsyncState)).e;
    UdpClient client = ((UdpStatus)(ar.AsyncState)).u;

    byte[] datagram = client.EndReceive(ar, ref endPoint);

    // Immediately begin listening for next packet so as to not miss any.
    client.BeginReceive(new AsyncCallback(UdpCallback), ar.AsyncState);

    lock (bufferLock)
    {
        // Fast processing of datagram.
        // This merely involves copying the datagram (scanline) into a larger buffer.
        //
        // WHEN READY:
        // Here I can see that scanlines are missing in my larger buffer.
    }
}

をコールバックに入れるSystem.Diagnostics.Debug.WriteLineと、パッケージの損失が劇的に増加します。このコールバック内のわずかなミリ秒の遅延が問題を引き起こしているようです。それでも、私のリリース ビルドでも同じ問題が見られます。

アップデート

UI に少し負荷をかけると、エラーの頻度が高くなります。インスタンスはUdpClientメインスレッドで実行されていますか?

4

1 に答える 1