2013-02-20 50 views
9

我正在嘗試創建一個方法,該方法接受TcpClient連接,並在客戶端連接後執行任務「ConnectedAction」。嘗試創建新任務以運行代理「ConnectedAction」時,我收到編譯錯誤。如何使用Task.Run(動作<T>)

參數1:不能從轉換「無效」到「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)); 
     } 
    } 
} 

回答

14

你應該寫:

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

這將創建一個lambda函數,它不帶參數,將調用指定的函數使用正確的說法。 lambda隱式地包裝到Task.Run參數所需的代理類型中。

你寫的內容調用函數,然後嘗試將函數的返回值變成委託。

+0

正是我在找的東西。謝謝! – 2013-02-20 05:56:55