我的问题可能很荒谬,但我在网上找不到任何信息。我的服务器不断读取从连接到它的客户端发送的数据,根据收到的数据,我执行某些操作。我的问题是,如果我的操作时间很长,我是否需要创建一个新线程以便 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个赞
处理长时间运行的任务的最佳方法是拥有一个线程,您可以启动并提交任务信息。这将允许您的主线程继续从客户端接收数据,而另一个线程继续处理您需要做的实际工作。
我通常实现的方法是为每个独特的任务定义一个函数,它接受必要的输入,在需要时由主任务启动。然后我保留一个向量来保存所有线程句柄,以便我们可以跟踪线程。
您将需要一种方法来同步由线程操作的任务的结果,这最终可能会产生竞争条件,因此您需要添加互斥锁以防止出现问题。您可能还想创建一个处理队列,该队列由客户端发送的消息填充,因为您不希望以数千个线程结束。
我通常设置一个线程限制,等于运行它的系统上的硬件线程,当我需要线程时,我只启动那么多。队列将允许未处理的数据等待线程完成其任务并变为可用。
有很多方法可以做到这一点,并没有真正正确的答案
- 1 回答
 - 0 关注
 - 205 浏览
 
添加回答
举报
0/150
	提交
		取消
	