加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用Task.Run(Action)

发布时间:2020-12-15 03:56:35 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个接受TcpClient连接并在客户端连接后执行任务的方法“ConnectedAction”.当尝试创建一个新的任务来运行委托“ConnectedAction”时,我收到编译错误. Argument 1: cannot convert from ‘void’ to ‘System.Func’ 我相信这个错误是因为该方
我正在尝试创建一个接受TcpClient连接并在客户端连接后执行任务的方法“ConnectedAction”.当尝试创建一个新的任务来运行委托“ConnectedAction”时,我收到编译错误.

Argument 1: cannot convert from ‘void’ to ‘System.Func’

我相信这个错误是因为该方法试图运行“ConnectedAction”方法并返回void到Task.Run参数.

如何让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参数所需的委托类型中.

你写的是调用该函数,然后尝试将函数的返回值转换为一个委托.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读