5

いくつかのスレッドを提供するクラス (A と呼びましょう) のインスタンスがあります。このインスタンスは、UdpClient クラスを介して UDP パケットのみを送信します。コンストラクターで UdpClient を初期化し、パケットの送信のみを行います。

次のようになります。

public class A{

private UdpClient m_Client;
public class A(string host, int port){

    m_Client = new UdpClient(host, port);
}

public void Send(string dataToSend){

 var data= encoding.GetBytes(dataToSend);
 client.BeginSend(data, data.Length, null, null);
}

}

私の質問は次のとおりです。

UdpClient がスレッド セーフではないことはわかっています (MSDN のドキュメントによると)。ロック メカニズムを使用せずにマルチスレッドをサポートする最善の方法は何ですか?

  1. 送信ごとに UdpClient の新しいインスタンスを作成しますか? (ローカルの UdpClient 変数を使用するだけです)。パフォーマンス?

  2. UdpClient に ThreadLocal を使用しますか? しかし、この状況で UdpClient を処分するのはどうでしょうか?

  3. 他の解決策はありますか?

4

2 に答える 2

1

最終的には、現在の実装は問題なく動作するはずです (Microsoft が UdpClient クラスの実装を変更しない限り)。

誰にとって興味深いか: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/cbdd9818-00f0-499f-a935-d8e555899d64

于 2013-02-17T09:34:03.717 に答える
0

UdpClientここでの最善の方法は、メソッドが呼び出されるたびに新しいを作成することだと思います。このようにして、コードが安全であることを確認できます。パフォーマンスが問題になる可能性は低く、プロファイリングで問題があることが示された場合にのみ、問題の解決を開始する必要があります。

EndSend()また、それぞれの後にBeginSend()(理想的にはコールバックで)呼び出すことを忘れないでください。

于 2013-02-17T11:25:38.633 に答える