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

14,054

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.

Share:
14,054
James Harmon
Author by

James Harmon

Updated on June 04, 2022

Comments

  • James Harmon
    James Harmon over 1 year

    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));
            }
        }
    }
    
  • James Harmon
    James Harmon almost 11 years
    Exactly what I was looking for. Thanks!