解决方案 »
- 如何能够在文本框的text属性中追加文本,或者在此属性中使文本换行?
- C#异形窗体,急!!!
- 请问用微软中间语言MSIL如何给一个对象字段赋值赋值?
- 如何通过WMI获取端口信息
- c#中如何获得一个窗体的多个menuitem事件的名称,并传递给另外的窗体
- 一个c# 权限问题
- 如果判断是不是从指定页面过来的?
- 如何在Global.asax中启动一个外部的.exe文件,作个一个线程,望高手指点
- C#中是否有类似于J#中的instanceof函数?用来判断是否为指定类的实例?
- C#初学者的学习3->用传统的ADO的困惑(connection.OpenSchema)
- 怎么给反射类中获取的属性赋值?
- 在弹出OpenFileDialog对话框之前,如何让点击的ToolStripMenuItem菜单消失?
中间件并不是我这里开发的,虽然可以改代码调试,但是我无权改动。
直接处理回调函数并不是不行,Queue的存在是我为客户端这里加上一层缓冲罢了。
中间件并不是我这里开发的,虽然可以改代码调试,但是我无权改动。
直接处理回调函数并不是不行,Queue的存在是我为客户端这里加上一层缓冲罢了。
按照sp1234的思路 中间件你无法更改,那在你的客户端,收到数据库,直接封装发布事件,真正处理的地方订阅不处理,类似多个线程同时处理收到的不同数据至于顺序的问题,能不能直接放到数据包中,类似udp通讯那种
*********************************************************
因为有先后顺序,所以用多线程一点作用都没有,所以只能用一个线程处理数据
_queue = new Queue();
_queue = Queue.Synchronized(_queue); 这样处理后就不要用代码加锁了
尝试一下,客户端收到数据就把数据放到queue里 queue.Enqueue,
这样客户端接收函数处理就足够快了
开一个threadtiemr线程,queue.Dequeue
这样肯定不会阻塞客户端
今天冷静下来,重新考虑客户端的结构,把不必要的旁枝末节都删掉,从头写。
问题解决掉了(写数据库,写文件都OK)。解决的步骤
1.因为回调函数是顺序执行的,也就是说只往内存中写数据是不会有问题的。所以用datatable存写库的数据,用arraylist存写文本文件的数据。(不必加锁)
2.当数据累计到一定程度(比如5000件),用线程池开线程QueueUserWorkItem处理 datatable或者arraylist的副本,然后清空datatable或者arraylist用来继续接收数据。数据的写入和拷贝都在内存中进行,而数据库操作和文件写入都在线程池进行,避免了回调函数的阻塞。为什么一开始不对,是因为原本有一套客户端代码,它开了几个线程用于监视有没有收到数据,而监视线程读取数据的时候就会和回调函数写入产生互斥。把不必要的监视线程去掉,也就豁然开朗了。