C# 应为带有IAsyncResult BeginSend的方法

C# 应为带有IAsyncResult BeginSend的方法,c#,.net,sockets,task-parallel-library,asyncsocket,C#,.net,Sockets,Task Parallel Library,Asyncsocket,嗨,我正在尝试创建一个水龙头包装器。ConnectTaskAsync很好,但是我在使用SendTaskAsync时遇到了一些困难 public static Task ConnectTaskAsync(this Socket socket, EndPoint endpoint) { return Task.Factory.FromAsync(socket.BeginConnect, socket.EndConnect, endpoint, null);

嗨,我正在尝试创建一个水龙头包装器。ConnectTaskAsync很好,但是我在使用SendTaskAsync时遇到了一些困难

public static Task ConnectTaskAsync(this Socket socket, EndPoint endpoint)
        {
            return Task.Factory.FromAsync(socket.BeginConnect, socket.EndConnect, endpoint, null);
        }

    public static Task<int> SendTaskAsync(this Socket socket, byte[] buffer, int offset, int size, SocketFlags flags)
    {
        return Task<int>.Factory.FromAsync(socket.BeginSend, buffer, offset, size, flags, socket.EndSend, null);
    }
公共静态任务ConnectTaskAsync(此套接字,端点)
{
返回Task.Factory.fromsync(socket.BeginConnect,socket.EndConnect,endpoint,null);
}
公共静态任务SendTaskAsync(此套接字、字节[]缓冲区、int偏移量、int大小、SocketFlags)
{
返回Task.Factory.fromsync(socket.BeginSend、缓冲区、偏移量、大小、标志、socket.EndSend、null);
}
我得到的错误是
BeginSend
下面有一条红色下划线,其中的消息应该是带有IAsyncResult BeginSend的方法


我哪里出错了?

您的
fromsync
定义不正确。不幸的是,没有一个可以接受4个独立参数(这是
BeginSend
所必需的),因此您需要:

公共静态任务SendTaskAsync(此套接字、字节[]缓冲区、int偏移量、int大小、SocketFlags)
{
AsyncCallback nullOp=(i)=>{};
IAsyncResult result=socket.BeginSend(缓冲区、偏移量、大小、标志、nullOp、套接字);
//使用直接获取IAsyncResult的重载
返回Task.Factory.fromsync(结果,socket.EndSend);
}

您的
fromsync
定义不正确。不幸的是,没有一个可以接受4个独立参数(这是
BeginSend
所必需的),因此您需要:

公共静态任务SendTaskAsync(此套接字、字节[]缓冲区、int偏移量、int大小、SocketFlags)
{
AsyncCallback nullOp=(i)=>{};
IAsyncResult result=socket.BeginSend(缓冲区、偏移量、大小、标志、nullOp、套接字);
//使用直接获取IAsyncResult的重载
返回Task.Factory.fromsync(结果,socket.EndSend);
}

回调不允许为
null
?@svick我不是100%确定-文档中没有任何内容指定它是可选的(我认为它取决于实现),我也不确定
Socket.BeginSend
是否希望它存在……Socket.EndSend上有错误“无法从方法组中选择方法。您打算调用该方法吗?@8位奇数-您应该能够将其编写为:
return Task.Factory.fromsync(result,socket.EndSend);
return Task.Factory.fromsync(result,(i)=>socket.EndSend(i))
编译器可能需要一些额外的帮助,这里不允许回调为
null
?@svick我不是100%确定-文档中没有任何内容指定它是可选的(我认为它取决于实现),我不确定,
Socket.BeginSend
是否希望它存在…Socket.EndSend上有错误“无法从方法组中选择方法”。您打算调用该方法吗?@8位奇数-您应该能够将其编写为:
return Task.Factory.fromsync(result,socket.EndSend);
return Task.Factory.fromsync(result,(i)=>socket.EndSend(i));
编译器可能需要一些额外的帮助
public static Task<int> SendTaskAsync(this Socket socket, byte[] buffer, int offset, int size, SocketFlags flags)
{
    AsyncCallback nullOp = (i) => {};
    IAsyncResult result = socket.BeginSend(buffer, offset, size, flags, nullOp, socket);
    // Use overload that takes an IAsyncResult directly
    return Task.Factory.FromAsync(result, socket.EndSend);
}