1

对 c# 和任务来说非常新...试图找到将 UDPclient 包装到 FromAsync(...) 中的正确语法,似乎我错过了一些参数...(不能使用 ReceiveAsync,因为它应该与 .NET 4.0 一起使用)

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

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

1 回答 1

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;
}
于 2013-02-07T22:51:17.760 回答