2013-02-20 10 views
9

TcpClient接続を受け入れ、クライアントが接続された後にタスク "ConnectedAction"を実行するメソッドを作成しようとしています。デリゲート "ConnectedAction"を実行するために作成された新しいタスクを作成しようとすると、コンパイルエラーが発生します。Task.Runを使用する方法(アクション<T>)

引数1:私は、メソッドが「ConnectedAction」メソッドを実行してに空白を返すようにしようとしているため、このエラーがあると信じている「System.Func」

に「無効」から変換することはできません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)); 

これはパラメータを取らず、正しい引数を使って指定された関数を呼び出しますラムダ関数を作成します。ラムダは暗黙的にTask.Runパラメータで必要なデリゲート型にラップされます。

あなたが書いたことは、関数を呼び出して、関数の戻り値をデリゲートに変換しようとします。

+0

私が探していたものです。ありがとう! –

関連する問題