15

我正在尝试创建一个接受 TcpClient 连接并在连接客户端后执行任务“ConnectedAction”的方法。尝试创建新任务以运行委托“ConnectedAction”时收到编译错误。

参数 1:无法从 'void' 转换为 'System.Func'

我相信这个错误是因为该方法试图运行“ConnectedAction”方法并将 void 返回给 Task.Run 参数。

如何让任务运行“ConnectedAction”委托?

class Listener
{
    public IPEndPoint ListenerEndPoint {get; private set;}
    public int TotalAttemptedConnections { get; private set; }
    public Action<TcpClient> ConnectedAction { get; private set; }

    public Listener(IPEndPoint listenerEndPoint, Action<TcpClient> connectedAction)
    {
        ConnectedAction = connectedAction;
        ListenerEndPoint = listenerEndPoint;

        Task.Factory.StartNew(Listen, TaskCreationOptions.LongRunning);
    }

    private void Listen()
    {
        TcpListener tcpListener = new TcpListener(ListenerEndPoint);
        tcpListener.Start();

        while (true)
        {
            TcpClient tcpClient = tcpListener.AcceptTcpClient();
            TotalAttemptedConnections++;

            //Error here 
            Task.Run(ConnectedAction(tcpClient));
        }
    }
}
4

1 回答 1

25

你应该写:

Task.Run(() => ConnectedAction(tcpClient));

这将创建一个不带参数的 lambda 函数,并将使用正确的参数调用您指定的函数。lambda 被隐式包装到Task.Run参数所需的委托类型中。

您编写的内容调用该函数,然后尝试将函数的返回值转换为委托。

于 2013-02-20T01:56:26.733 回答