2013-02-20 12 views
9

Próbuję utworzyć metodę, która akceptuje połączenia TcpClient i wykonuje zadanie po podłączeniu klienta, "ConnectedAction". Otrzymuję błąd kompilacji podczas próby utworzenia nowego zadania do uruchomienia delegata "ConnectedAction".Jak używać Task.Run (Działanie <T>)

Argument 1: nie można przekonwertować z „void” do „System.Func”

wierzę, że ten błąd jest, ponieważ metoda próbuje uruchomić „ConnectedAction” metody i powrócić do pustki Parametr Task.Run.

Jak mam zadanie uruchomić delegata "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)); 
     } 
    } 
} 

Odpowiedz

14

Należy napisać:

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

To tworzy funkcję lambda, która pobiera żadnych parametrów i nie dzwoni do określonej funkcji z odpowiednim argumentem. Wartość lambda jest niejawnie zawijana do typu delegata wymaganego przez parametry Task.Run.

To, co zostało napisane, wywołuje funkcję, a następnie próbuje przekształcić wartość zwracaną funkcji w delegata.

+0

Dokładnie tego, czego szukałem. Dzięki! –