我正在使用c#UdpClient通过udp接收数据。一切正常,但一段时间后,方法receiveClient不会返回。
首先,我认为这是一个同步问题,所以我将共享资源(lastPackage)附加了一个锁,但这没有帮助。
我调试了程序(由于异步接收很难),最后发现方法endReceive没有返回。 udp源会继续发送包。
下面我已经打印了相关的程序部分。
public class UDPSocket {
private IPEndPoint receiveEndPoint;
private UdpClient receiveClient;
private byte[] lastPackage;
private bool unhandledPackage;//shared resource
private Dictionary<string, string> agentsMap;
public UDPSocket(string sendIp, int sendPort, int receivePort){
receiveEndPoint = new IPEndPoint (IPAddress.Any, receivePort);
receiveClient = new UdpClient (receiveEndPoint);
singleton.receiveClient.BeginReceive(new AsyncCallback(singleton.ReceiveCallback), null);
unhandledPackage = false;
agentsMap = new Dictionary<string, string> ();
}
public void Update () {//is called once per second
if (unhandledPackage) {
string rawString = Encoding.UTF8.GetString(lastPackage);
agentsMap = Parser.parseString(rawString);
unhandledPackage = false;
receiveClient.BeginReceive(new AsyncCallback(ReceiveCallback), null);
}
}
public string getEmotion(string id){
string emotion;
if(!agentsMap.TryGetValue(id, out emotion)){
return "No connection";
}
return emotion;
}
public void OnDestroy()
{
if (receiveClient != null) {
receiveClient.Close ();
}
}
public void ReceiveCallback(IAsyncResult ar)
{
lastPackage = receiveClient.EndReceive(ar, ref receiveEndPoint);//DOES NOT RETURN FROM THIS METHOD CALL
unhandledPackage = true;
}
我简化了程序,只显示可能相关的部分。 如果有人能帮助我,我会感激不尽。
此致 扬
答案 0 :(得分:0)
如果您使用的是.net 4.5,只需使用async&amp; await关键字,这样:
private static async void Foo(int port)
{
UdpClient udpClient=new UdpClient(port);
UdpReceiveResult result = await udpClient.ReceiveAsync();
}
答案 1 :(得分:0)
EndReceive
将阻止。
我认为receiveClient
中的ReceiveCallback
是与receiveClient
一起使用的另一个BeginReceive
。因此,请确保使用相同的实例。