我的问题可能很荒谬,但我在网上找不到任何信息。我的服务器不断读取从连接到它的客户端发送的数据,根据收到的数据,我执行某些操作。我的问题是,如果我的操作时间很长,我是否需要创建一个新线程以便 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 关注
- 162 浏览
添加回答
举报
0/150
提交
取消