【问题标题】:C# : What Will Be The Greatest? Multiple Task or Single for One Job?C#:什么是最伟大的?多项任务还是一项任务?
【发布时间】:2013-05-18 14:57:10
【问题描述】:

我有这个代码:

public async virtual void Start(IPAddress ip, int port)
    {
        //Start listening proccess
        Listener = new TcpListener(ip, port);
        Listener.Start();
        IsListening = true;
        await Task.Run(async () =>
            {
                while (IsListening)
                {
                    if (Listener.Pending())
                    {
                        TcpClient client = await Listener.AcceptTcpClientAsync();
                        SkyfilterClient sklient = new SkyfilterClient(client);
                        byte command = sklient.Reader.ReadByte();
                        if (command == (byte) SkyfilterCommand.Authenticate)
                        {
                            sklient = await Authenticate(sklient);
                        }
                        else if(command == (byte)SkyfilterCommand.Register)
                        {
                            sklient = await Register(sklient);
                        }
                    }
                }
            });
    }

Program.cs 中的代码,main 方法

new SkyfilterCoreLib.Network.SkyfilterServer().Start(IPAddress.Loopback, 7812);
Console.ReadLine();

如果我有异步 lambda 是最好的吗?或者我只使用一项任务,让听众只使用Listener.AcceptTcpClient?哪一个有最好的表现? 谢谢

【问题讨论】:

    标签: c# multithreading networking multitasking


    【解决方案1】:

    根本不清楚您为什么要创建任务。无论如何,您都在等待该任务的完成,所以为什么不直接使用:

    Listener = new TcpListener(ip, port);
    Listener.Start();
    IsListening = true;
    while (IsListening)
    {
        if (Listener.Pending())
        {
            var client = await Listener.AcceptTcpClientAsync();
            // I assume you want to do something with the client now...
        }
    }
    

    在这种情况下,如果您使这个位同步,则不会有太大的不同——这实际上取决于您是否想要监听异步操作本身的业务。

    我认为更大的问题是,一旦您接受了客户,您将如何处理它。您可能希望使用另一种异步方法来处理客户端但不等待结果

    List<Task> ongoingTasks = new List<Task>();
    ...
    var client = await Listener.AcceptTcpClientAsync();
    ongoingTasks.Add(HandleClientAsync(client));
    

    然后,当您想关闭时,您可以等待所有正在进行的任务完成(可能有超时),然后再让进程终止。

    【讨论】:

    • @AdityaHeartly:这取决于你所说的“阻塞”到底是什么意思以及你的代码的其余部分是做什么的——但它不会比你以前的代码更糟糕,它等待新创建的任务.你对 await 的作用了解多少?
    • 几天前我只用了 await。当我在任务之外执行循环时,它会阻止我的程序来监听输入(控制台)。我需要我的程序即使在处理某些东西时也能做出响应。我应该等待Task.Run 而不要等待AcceptTcpClient,还是应该等待Task.RunAcceptTcpClient 同步运行?
    • @AdityaHeartly:抱歉,您的意思不是很清楚。您必须显示更多代码来解释您的意思。但是,如果您也能够异步监听输入,那么您应该能够合理简单地处理所有这些。
    • 我要问的是,如果我等待一个内部有 await 表达式的任务,这是否被认为是好的?我将编辑我的代码
    • @AdityaHeartly:这本身没问题 - 但如果您只是启动任务并等待它,那么当您知道任务本身不会消耗太多时间时,它是没有意义的。这就像启动一个新线程然后在其上调用Join。如果您在另一个线程中执行 CPU 密集型工作,并且希望避免阻塞 UI 线程或类似的事情,那将是有意义的 - 但这里不是这种情况。
    猜你喜欢
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多