2013-02-07 61 views
1

對c#和任務來說很新...試圖找到將UDPclient包裝到FromAsync(...)中的正確語法,似乎我錯過了一些參數...(不能使用ReceiveAsync,因爲它應該工作與 .NET 4.0)UdpClient語法FromAsync

public Task<byte[]> GetUDPmessageAsync() 
{ 
    byte[] data = new byte[100]; 
    myUdpClient = new UdpClient(12000); 

    Task<byte[]> task = Task<byte[]>.Factory.FromAsync(myUdpClient.BeginReceive, myUdpClient.EndReceive,?,?); 
} 

回答

3

我不認爲你可以使用FromAsync因爲UdpClient.EndReceive採取ref參數,這使得它與FromAsync的所有重載不兼容。儘管如此,您可以製作自己的擴展方法:

public static Task<byte[]> ReceiveAsync(this UdpClient client, IPEndPoint endpoint) 
{ 
    TaskCompletionSource<byte[]> tcs = new TaskCompletionSource<byte[]>(); 
    AsyncCallback callback = ar => { 
     try 
     { 
      byte[] bytes = client.EndReceive(ar, ref endpoint); 
      tcs.SetResult(bytes); 
     } 
     catch(Exception ex) 
     { 
      tcs.SetException(ex); 
     } 
    }; 
    client.BeginReceive(callback, null); 
    return tcs.Task; 
} 
+0

非常感謝!它運作良好。我看到UDP數據報消息是以某種方式緩衝的。當我一次調用這個方法時,保持執行並在一段時間後再調用該方法,它將立即返回那些同時接收到的消息。假設我應該關閉客戶端並每次創建一個新客戶端。無論如何,我最初的問題解決了,我可以移動一個... – Boris