2013-12-19 23 views
0

我正在使用c#UdpClient通過udp接收數據。一切正常,但過了一段時間receiveClient方法不返回。C#UdpClient不會從EndReceive返回

首先,我認爲這是一個同步問題,所以我用共享資源(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

什麼是'singleton.receiveClient'? – JeffRSon

回答

0

如果您使用的是.NET 4.5,簡單地使用異步&等待的關鍵字,這樣一來:

private static async void Foo(int port) 
    { 
     UdpClient udpClient=new UdpClient(port); 
     UdpReceiveResult result = await udpClient.ReceiveAsync(); 
    } 
0

EndReceive將阻止如果異步操作尚未完成。

我假設receiveClientReceiveCallback是另一個receiveClient,因爲它與BeginReceive一起使用。所以確保你使用相同的實例。