看看你的2是“另开多个线程处理队列信息”:如果你的队列,是用一个线程去“阻塞、然后顺序处理第一个任务”的,那么它只是顺序程序。而如果它是多线程并发处理任务,同样是多线程处理任务,那么你又凭什么认为方法1更复杂呢?因此你的方法2,纯粹是多余的。我只能认为你是因为比较容易抄袭到一些代码,所以会列出2。从你的流程描述中看不出有什么理由使用2。只要有1和3即可。使用3在“线程处理”问题方面跟2是一样的,因此这方面看它与1也是没法比的。但是使用MSMQ的好处就是这个服务可以自动进行消息持久化和通讯的独立服务,即使你的服务器进程意外中断,那么重启以后也可以继续执行。(当然,但愿你知道这些并且用到这些,否则根本没有使用3.)
解决方案 »
- 关于XML转实体类
- 跪求大牛前来指点迷津 应该算是异步调用,线程访问控件? 这问题我也不知道怎么定义...
- 如何将MSChart控件中的统计图导出到Excel
- asp前台js中怎么得到后台List集合中的数据
- C#2005中dataGridView的问题
- 单件模式的基Form,两个继承它的窗口,实例化时一个窗口,另一个窗口无法实例化了。
- long 和 int 的转换问题
- 打开文件提示版本问题!
- 能不能让VS.net编译完项目,自动对代码进行混淆?
- 我想用updata更新修改我的数据(在线等~~~~)
- C#操作Excel文件的图表对象Chart问题
- 开发C# winform项目会使用到js么 , 感觉开发网站比较累 ,需要的知识量较大,而且周期长 想转手机WP开发或者winform开发
你的意思是接收数据后直接Task.factory.startnew(()=>DealData());更好?
但是我说了数据接收有时频率很高,比如10毫秒就会接收数据。不断的执行Task.factory.startnew会不会造成性能问题?谢谢!昨天发完贴自己按照方式2写了代码。类似如下:
public form1(){
Task.factory.startnew(()=>DealData());
}//接收数据
void OndataReceive( string data){
queue.Enqueue(data);放入队列
(如果是方式1,就是在这里直接Task.factory.startnew(()=>DealData());但是接收频率很快,也即可能1秒钟有几十次这个执行)retutn;
}//处理数据
void DealData(){
while(true){
for(int i =0; i < queue.Count; i++){
string s= queue.Dequeue();
...处理数据....Thread.Sleep(10);
}
}.
}
”为什么不在系统线程池里注册“...处理数据....”方法?你中间额外地弄一堆“什么队列、什么DealData、多出来的for循环,多出来这么多操作要进行,有什么意义?
不懂什么叫做“对性能稳定”。使用MSMQ肯定会让性能大大降低,以求稳定一点。实际上,通常是用不着这么稳定。如果服务器重启,那么未处理的消息可以扔掉。
你是意思是接收数据后使用ThreadPool.QueueUserWorkItem() ? 如果是这个,我看到的很多文章都推荐使用task来替代 ?
另外,看到大家的回复我也不断在查阅资料,发现这个问题有点开放了。
如http://blog.csdn.net/sq_zhuyi/article/details/6869661
显示我自己根据前面的方式2设计了程序,即接收数据后直接放入队列【根据实际分为4个队列】,另外针对每一个队列开启一个线程专门处理队列中数据。但是这样线程这样多,是否影响性能...,怎样测试这种多线程程序性能?
不知有没有可以参考的并行框架或好的处理方案。谢谢!!
5个线程一点都不算多。只要不是100%CPU的线程,几十个都没问题。
void DealData(){
while(true){
}
}
我说了 我看到你这代码我就笑了..难道while(true)是你说的异步么.那beginreceive是什么???你连基本的东西好像都不是很清楚.还玩高端的东西..所谓的socket服务不就是开启一监听端口 接收来自世界各地的socket连接 接收数据么..而且核心方法难道不是3个 有连接,.,有发送...有断开.....这3个方法么?多少年前早就有人写好的东西了.我上面所有的意思都是 前人栽树后人乘凉而已..就好比aspnetpager都有人10年前就写出来的 我们拿来用就好啊.. 何必自己写.而且人家也开源,代码参考下就行了 这东西真没必要自己写的...
10毫秒很高么...随便socket异步中的beginreceive就轻松搞定了..都不需要高端的socketasynceventargs..
10毫秒很高么...随便socket异步中的beginreceive就轻松搞定了..都不需要高端的socketasynceventargs..还是很感谢你的回复顶贴。
你自己找本书看下吧,或者问问你身边的朋友,几千几万行代码你看到while(true)就是同步程序了,为什么不是直接死机奔溃了。死循环嘛
如果需要顺序处理,就需要一个队列(频率高的最好是双队列),专门用一个线程来处理数据队列。可以用EventWaitHanlde做同步通知,也可以用Thread.Sleep(1)做轮询,都无所谓的。
即使自定义了队列,开了多线程之后,也无法保证执行的先后顺序,因为线程间各不干扰,有的执行快,有的执行慢,你没法保证先执行的就先完成.
而如果使用线程同步,则效率降低,而且跟单线程等效,效率可能还不如单线程谢谢,是这样的,我根据我这边的具体数据分析,我这个接收到的数据可以分成4个类型,且这4个类型的数据可以互相独立。所以我现在的办法是,接收到数据后,判断数据类型,预先设置了4个队列,把数据分别放入相应的队列。然后,针对那4个队列,分别用4个线程去处理。处理方式就是前面的while(true ) ... 每次sleep(10)。我目前按照这个方式运行几天了,发现CPU 和 内存占用特别多(内存和CPU一直增)。我了解了下,据说是while(true)循环涉及了引用类型的全局变量字典【因为我处理数据完后会把结果保存在一个字典里,所以等于在while里使用了全局变量】,导致内存一直无法释放,所以会这样。不知有什么好的思路解决?
谢谢!
谢谢,我现在就是用4个线程处理四个队列的数据。但是发现用Thread.Sleep(1)做轮询,期间我处理数据完后会把结果保存在一个字典里,所以等于在while里使用了全局变量,导致内存和CPU一直增....不知如何解决,谢谢!!
即使自定义了队列,开了多线程之后,也无法保证执行的先后顺序,因为线程间各不干扰,有的执行快,有的执行慢,你没法保证先执行的就先完成.
而如果使用线程同步,则效率降低,而且跟单线程等效,效率可能还不如单线程谢谢,是这样的,我根据我这边的具体数据分析,我这个接收到的数据可以分成4个类型,且这4个类型的数据可以互相独立。所以我现在的办法是,接收到数据后,判断数据类型,预先设置了4个队列,把数据分别放入相应的队列。然后,针对那4个队列,分别用4个线程去处理。处理方式就是前面的while(true ) ... 每次sleep(10)。我目前按照这个方式运行几天了,发现CPU 和 内存占用特别多(内存和CPU一直增)。我了解了下,据说是while(true)循环涉及了引用类型的全局变量字典【因为我处理数据完后会把结果保存在一个字典里,所以等于在while里使用了全局变量】,导致内存一直无法释放,所以会这样。不知有什么好的思路解决?
谢谢!个人感觉目前的问题是因为数据接收完后
还要处理数据解析等操作,然后才通过队列实现了异步化。
应该是接收数据后,触发数据处理事件,
把耗时的数据拼包、数据校验及业务层解析等等统统放到线程池中去,
数据解析完成后,这个任务就结束了。
这种很频繁但执行时间比较断的数据处理模型特别适合用线程池。 memHandle = ThreadPool.RegisterWaitForSingleObject(
dataEv,
new WaitOrTimerCallback(RealDataHandler),
this,
10000,
false
);
即使自定义了队列,开了多线程之后,也无法保证执行的先后顺序,因为线程间各不干扰,有的执行快,有的执行慢,你没法保证先执行的就先完成.
而如果使用线程同步,则效率降低,而且跟单线程等效,效率可能还不如单线程谢谢,是这样的,我根据我这边的具体数据分析,我这个接收到的数据可以分成4个类型,且这4个类型的数据可以互相独立。所以我现在的办法是,接收到数据后,判断数据类型,预先设置了4个队列,把数据分别放入相应的队列。然后,针对那4个队列,分别用4个线程去处理。处理方式就是前面的while(true ) ... 每次sleep(10)。我目前按照这个方式运行几天了,发现CPU 和 内存占用特别多(内存和CPU一直增)。我了解了下,据说是while(true)循环涉及了引用类型的全局变量字典【因为我处理数据完后会把结果保存在一个字典里,所以等于在while里使用了全局变量】,导致内存一直无法释放,所以会这样。不知有什么好的思路解决?
谢谢!个人感觉目前的问题是因为数据接收完后
还要处理数据解析等操作,然后才通过队列实现了异步化。
应该是接收数据后,触发数据处理事件,
把耗时的数据拼包、数据校验及业务层解析等等统统放到线程池中去,
数据解析完成后,这个任务就结束了。
这种很频繁但执行时间比较断的数据处理模型特别适合用线程池。 memHandle = ThreadPool.RegisterWaitForSingleObject(
dataEv,
new WaitOrTimerCallback(RealDataHandler),
this,
10000,
false
);谢谢!
我参考了你的思路,现在改成接收到数据后,直接放入一个队列(因为要保证数据的顺序)。
然后在form()构造函数里开启了一个处理线程。
void start()
{
ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(ReadQueue), this, 10, false);
}
这样让线程池每隔10ms就读一次队列。你看这样行不?或者是接收到数据后,直接
ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(data(数据项)), this, 10, true);
?谢谢!
即使自定义了队列,开了多线程之后,也无法保证执行的先后顺序,因为线程间各不干扰,有的执行快,有的执行慢,你没法保证先执行的就先完成.
而如果使用线程同步,则效率降低,而且跟单线程等效,效率可能还不如单线程谢谢,是这样的,我根据我这边的具体数据分析,我这个接收到的数据可以分成4个类型,且这4个类型的数据可以互相独立。所以我现在的办法是,接收到数据后,判断数据类型,预先设置了4个队列,把数据分别放入相应的队列。然后,针对那4个队列,分别用4个线程去处理。处理方式就是前面的while(true ) ... 每次sleep(10)。我目前按照这个方式运行几天了,发现CPU 和 内存占用特别多(内存和CPU一直增)。我了解了下,据说是while(true)循环涉及了引用类型的全局变量字典【因为我处理数据完后会把结果保存在一个字典里,所以等于在while里使用了全局变量】,导致内存一直无法释放,所以会这样。不知有什么好的思路解决?
谢谢!个人感觉目前的问题是因为数据接收完后
还要处理数据解析等操作,然后才通过队列实现了异步化。
应该是接收数据后,触发数据处理事件,
把耗时的数据拼包、数据校验及业务层解析等等统统放到线程池中去,
数据解析完成后,这个任务就结束了。
这种很频繁但执行时间比较断的数据处理模型特别适合用线程池。 memHandle = ThreadPool.RegisterWaitForSingleObject(
dataEv,
new WaitOrTimerCallback(RealDataHandler),
this,
10000,
false
);谢谢!
我参考了你的思路,现在改成接收到数据后,直接放入一个队列(因为要保证数据的顺序)。
然后在form()构造函数里开启了一个处理线程。
void start()
{
ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(ReadQueue), this, 10, false);
}
这样让线程池每隔10ms就读一次队列。
可行
多说一句,多线程访问队列,须处理同步
队列本身不是线程安全的,要加锁避免出脏数据
谢谢,我昨天调试发现同步问题了,加了lock控制。