如何使用Task.Run(操作<;T>;)
本文关键字:lt gt 操作 何使用 Task Run | 更新日期: 2023-09-27 18:00:16
我正试图创建一个方法,该方法接受TcpClient连接,并在连接客户端后执行任务"ConnectedAction"。尝试创建新任务以运行委托"ConnectedAction"时,我收到一个编译错误。
参数1:无法从"void"转换为"System.Func"
我认为这个错误是因为该方法试图运行"ConnectedAction"方法并向Task.run参数返回void。
如何让Task运行"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));
}
}
}
您应该写:
Task.Run(() => ConnectedAction(tcpClient));
这将创建一个不带参数的lambda函数,并使用正确的参数调用指定的函数。lambda隐式包装到Task.Run
参数所需的委托类型中。
您编写的内容调用函数,然后尝试将函数的返回值转换为委托。