异步socket服务器长操作任务

我的问题可能很荒谬,但我在网上找不到任何信息。


我的服务器不断读取从连接到它的客户端发送的数据,根据收到的数据,我执行某些操作。


我的问题是,如果我的操作时间很长,我是否需要创建一个新线程以便 BeginRecieve 不会被阻塞?如果没有,我需要做什么?


代码:


private void ReceiveCallback(IAsyncResult ar)

{

    try

    {

        Socket current = (Socket)ar.AsyncState;

        int received;

        try

        {

            received = current.EndReceive(ar);

        }

        catch

        {

            return;

        }


        byte[] recBuf = new byte[received];

        Array.Copy(buffer, recBuf, received);

        var st = Helper.ByteToObject(recBuf);

        if ((st is string s))

        {

            if (s == "Something")

            {

                //Long operating task, do i need to use a new thread?

            }

        }

        current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);

    }

    catch

    {

        return;

    }

}


FFIVE
浏览 142回答 1
1回答

翻阅古今

处理长时间运行的任务的最佳方法是拥有一个线程,您可以启动并提交任务信息。这将允许您的主线程继续从客户端接收数据,而另一个线程继续处理您需要做的实际工作。我通常实现的方法是为每个独特的任务定义一个函数,它接受必要的输入,在需要时由主任务启动。然后我保留一个向量来保存所有线程句柄,以便我们可以跟踪线程。您将需要一种方法来同步由线程操作的任务的结果,这最终可能会产生竞争条件,因此您需要添加互斥锁以防止出现问题。您可能还想创建一个处理队列,该队列由客户端发送的消息填充,因为您不希望以数千个线程结束。我通常设置一个线程限制,等于运行它的系统上的硬件线程,当我需要线程时,我只启动那么多。队列将允许未处理的数据等待线程完成其任务并变为可用。有很多方法可以做到这一点,并没有真正正确的答案
打开App,查看更多内容
随时随地看视频慕课网APP