15

TcpClient接続を受け入れ、クライアントが接続されるとタスクを実行するメソッド「ConnectedAction」を作成しようとしています。デリゲート「ConnectedAction」を実行するために新しいタスクを作成しようとすると、コンパイルエラーが発生します。

引数1:「void」から「System.Func」に変換できません

このエラーは、メソッドが「ConnectedAction」メソッドを実行し、Task.Runパラメーターにvoidを返そうとしているためだと思います。

タスクに「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));
        }
    }
}
4

1 に答える 1

25

あなたは書くべきです:

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

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

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

于 2013-02-20T01:56:26.733 に答える