Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自Async的UdpClient语法_C#_Task Parallel Library - Fatal编程技术网

C# 来自Async的UdpClient语法

C# 来自Async的UdpClient语法,c#,task-parallel-library,C#,Task Parallel Library,对c#和任务来说是很新的。。。试图找到将UDPclient包装成FromAsync(…)的正确语法,似乎遗漏了一些参数…(不能使用ReceiveAsync,因为它应该可以使用。) .NET(4.0版) 公共任务GetUDPmessageAsync() { 字节[]数据=新字节[100]; myUdpClient=新的UdpClient(12000); Task Task=Task.Factory.fromsync(myUdpClient.BeginReceive、myUdpClient.EndR

对c#和任务来说是很新的。。。试图找到将UDPclient包装成FromAsync(…)的正确语法,似乎遗漏了一些参数…(不能使用ReceiveAsync,因为它应该可以使用。) .NET(4.0版)

公共任务GetUDPmessageAsync() { 字节[]数据=新字节[100]; myUdpClient=新的UdpClient(12000); Task Task=Task.Factory.fromsync(myUdpClient.BeginReceive、myUdpClient.EndReceive、、?); }
我认为您不能使用
fromsync
,因为
UdpClient.EndReceive
使用ref参数,这使得它与
fromsync
的所有重载都不兼容。不过,您可以创建自己的扩展方法:

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;
}
publicstatictask ReceiveAsync(此UdpClient客户端,IPEndPoint端点)
{
TaskCompletionSource tcs=新的TaskCompletionSource();
AsyncCallback=ar=>{
尝试
{
byte[]bytes=client.EndReceive(ar,ref端点);
tcs.SetResult(字节);
}
捕获(例外情况除外)
{
tcs.SetException(ex);
}
};
client.BeginReceive(回调,空);
返回tcs.Task;
}

非常感谢!它工作得很好。我看到UDP数据报消息以某种方式被缓冲。当我调用这个方法一次,保持执行并在稍后再次调用该方法时,它将立即返回,同时一个接一个地接收到这些消息。假设我应该关闭客户端,每次都创建一个新的客户端。不管怎样,我最初的问题解决了,我可以移动一个。。。
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;
}