我有一个类的实例(让我们称之为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文档),在不使用锁定机制的情况下支持多线程的最佳方法是什么?
在每次发送时创建UdpClient的新实例? (只需使用一些本地UdpClient var)。 性能
将ThreadLocal用于UdpClient?但是在这种情况下处理UdpClient呢?
还有其他解决方案吗?
答案 0 :(得分:1)
最终我相信我当前的实现应该没有问题(只要Microsoft不会更改UdpClient类实现)。
答案 1 :(得分:0)
我认为这里最好的方法是每次调用方法时创建一个新的UdpClient
。这样,您可以确保代码是安全的。性能不是一个问题,如果分析显示它是,那么你应该开始解决它。
此外,您不应该忘记在每次EndSend()
之后致电BeginSend()
(理想情况下在回调中)。