简体   繁体   中英

How to use Task.Run(Action<T>)

I am attempting to create a method that accepts TcpClient connections and performs a task once a client is connected, "ConnectedAction". I am receiving a compile error when trying to have a new task created to run the delegate "ConnectedAction".

Argument 1: cannot convert from 'void' to 'System.Func'

I believe that this error is because the method is trying to run the "ConnectedAction" method and return void to the Task.Run parameter.

How do I have the Task run the "ConnectedAction" delegate?

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));
        }
    }
}

You should write:

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

This creates a lambda function that takes no parameters and will call your specified function with the correct argument. The lambda is implicitly wrapped into the delegate type needed by the Task.Run parameters.

What you wrote calls the function and then attempts to turn the return value of the function into a delegate.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM