我试图创建一种方法,该方法接受TcpClient连接并在客户端连接后执行任务“ConnectedAction”。尝试创建一个新任务来运行委托(delegate)“ConnectedAction”时,我收到编译错误。
我认为此错误是因为该方法正在尝试运行“ConnectedAction”方法,并将void返回给Task.Run参数。
如何让任务运行“ConnectedAction”委托(delegate)?
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));
}
}
}
最佳答案
您应该写:
Task.Run(() => ConnectedAction(tcpClient));
这将创建一个不带参数的lambda函数,并将使用正确的参数调用您指定的函数。 lambda被隐式包装为
Task.Run
参数所需的委托(delegate)类型。您编写的内容将调用该函数,然后尝试将函数的返回值转换为委托(delegate)。
关于c# - 如何使用Task.Run(Action <T>),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14970954/