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

最终我相信我当前的实现应该没有问题(只要微软不会改变 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 回答