为了账号安全,请及时绑定邮箱和手机立即绑定

异步socket服务器长操作任务

异步socket服务器长操作任务

C#
FFIVE 2021-12-05 17:02:32
我的问题可能很荒谬,但我在网上找不到任何信息。我的服务器不断读取从连接到它的客户端发送的数据,根据收到的数据,我执行某些操作。我的问题是,如果我的操作时间很长,我是否需要创建一个新线程以便 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;    }}
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

处理长时间运行的任务的最佳方法是拥有一个线程,您可以启动并提交任务信息。这将允许您的主线程继续从客户端接收数据,而另一个线程继续处理您需要做的实际工作。

我通常实现的方法是为每个独特的任务定义一个函数,它接受必要的输入,在需要时由主任务启动。然后我保留一个向量来保存所有线程句柄,以便我们可以跟踪线程。

您将需要一种方法来同步由线程操作的任务的结果,这最终可能会产生竞争条件,因此您需要添加互斥锁以防止出现问题。您可能还想创建一个处理队列,该队列由客户端发送的消息填充,因为您不希望以数千个线程结束。

我通常设置一个线程限制,等于运行它的系统上的硬件线程,当我需要线程时,我只启动那么多。队列将允许未处理的数据等待线程完成其任务并变为可用。

有很多方法可以做到这一点,并没有真正正确的答案


查看完整回答
反对 回复 2021-12-05
  • 1 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信