中间件服务器中,一个客户端连接上来,必须启动一个TCP去连接某个应用服务器,由于应用服务器中有若干指令需要交付,因此必须等待这些指令均完成,然后才给客户端一个反馈,请问如何实现一个等待,就是等待与应用服务器之间的指令完成。本题要点:1、同一子线程,若是使用While等的等待判断,会影响与应用服务器之间的通讯。
2、等待之时不可以影响与应用服务器之间的通讯。
3、应用服务器程序并非本人开发,因此无法调整应用服务器的模式。
2、等待之时不可以影响与应用服务器之间的通讯。
3、应用服务器程序并非本人开发,因此无法调整应用服务器的模式。
解决方案 »
- 找不到引用求助。
- 用C#写的一个UDP的Socket程序,传送多个图片数据,正常显示了几个图片后就报错:一个在数据报套接字上发送的消息大于内部消息缓冲器或其他一些网络限制,或该用户用于接收数据报的缓冲器比数据报小。
- 如何通过PrintDocument打印瘦字体甚至变形字体?
- 各位大侠救命啊! 我想批处理用搜索引擎进行搜索, 不知道应该如何实现呀?
- 有人知道ocr的问题吗???求助
- 关于优化Socket通讯的问题?
- 如何实现DataGrid只显示字段名?
- vs2005中 Dns.GetHostByName 的替代方法是什么?
- 如何去掉系统的打印的“取消打印”对话框
- 请问可以实现这个思路吗?
- 两个子线程如何通讯?
- 连接字符的问题
void OnClientConnect(int token)
{
if( token == 0 )
{
token = QueueApplicationServerTask();
}
Status status = WaitForTask(token, timeout);
if ( status == Status.Done )
{
ClientOK(token);
}
else if( status == Status.Pending )
{
ClientPleaseTryAgain(token);
}
}
对于你只有一个wait的情况,这两个是完全一样的(甚至代码都是一模一样的)。它们都是导致线程阻塞,从而你的系统中有大量线程同时被阻塞。系统的线程池是有限的。如果不使用线程池,而是随便new线程,那就更浪费管理时间了。对于发送、接收数据,你可以考虑使用异步操作。比如对于TcpClient来说,使用 .GetStream().BeginWrite(...) 和 .GetStream().BeginRead(...),而不是 Write和Read,这样避免系统中有太多的被阻塞线程。
我用Task实现了,但是由于之前有用到一个回调函数,因此导致了又阻塞,后来发现了,删除了这个回调函数就可以了。另外,用Task的情况下,可以不要回调函数,直接用ref就可以了。
因此,我认为线程之间用回调函数的话可能也会引起阻塞,或许之前就是因为这个回调函数阻塞了。