2013-02-20 23 views
9

Sto tentando di creare un metodo che accetta connessioni TcpClient ed esegue un'attività una volta che un client è connesso, "ConnectedAction". Sto ricevendo un errore di compilazione quando provo ad avere una nuova attività creata per eseguire il delegato "ConnectedAction".Come utilizzare Task.Run (Azione <T>)

Argomento 1: non può convertire da 'vuoto' a 'System.Func'

Credo che questo errore è perché il metodo sta cercando di eseguire il metodo "ConnectedAction" e tornare al vuoto Parametro Task.Run.

Come è possibile che l'attività esegua il delegato "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)); 
     } 
    } 
} 

risposta

14

Si dovrebbe scrivere:

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

questo modo si crea una funzione lambda che non accetta parametri e chiamerà la funzione specificata con l'argomento corretto. Il lambda è implicitamente incluso nel tipo di delegato richiesto dai parametri Task.Run.

Quello che hai scritto chiama la funzione e poi tenta di trasformare il valore di ritorno della funzione in un delegato.

+0

Esattamente quello che stavo cercando. Grazie! –

Problemi correlati