关于多线程间通信的问题

边城狂人 2009-07-01 10:41:20
现在我有多个线程,如
threadLog, thread1, thread2, thread3 ....
除了threadLog之外,其它每个线程的操作都需要记录下来,也就是说,需要写日志。但是问题在于,写日志的操作是线程不安全的,所以我初步打算是让它在threadLog里写日志,问题是,我如何在其它线程里让将信息传递给threadLog,并让它记录日志呢?

希望大家帮帮忙,能提供小示例更佳!
先谢!
...全文
176 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
haiwangstar 2009-07-02
  • 打赏
  • 举报
回复
我做过类似你这样的问题.我的做法是用Queue<T>解决的.同楼上说的一样. 我是有多个线程产生数据,一个线程负责发送数据给远端,我让产生数据的线程产生数据后就立即用Enqueue把数据排队到队列中,同时置AutoResetEvent对象,以通知发送线程去读取. 读取线程用Dequeue读取数据..当然要自己实现线程同步..
龙宜坡 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 netcoder 的回复:]
参考12楼

我一般使用Queue
thread1、thread2...进行Enqueue操作
threadLog进行Dequeue操作
[/Quote]

不错的选择
netcoder 2009-07-02
  • 打赏
  • 举报
回复
参考12楼

我一般使用Queue
thread1、thread2...进行Enqueue操作
threadLog进行Dequeue操作
wangsaokui 2009-07-02
  • 打赏
  • 举报
回复
除了threadLog之外,其它每个线程的操作都需要记录下来,也就是说,需要写日志。但是问题在于,写日志的操作是线程不安全的

写的确是不安全的,但保存是安全的,比如你做一个ArrayListA,然后各个线程添加消息到ArrayListA是安全的,需要保存的时候可以声明另外一个ArrayListB,然后将ArrayListA拷贝到ArrayListB,让ArrayListB去保存,保存后清除ArrayListA中的数据,(清楚位置索引范围就是拷贝到B时的索引范围)
wqzone 2009-07-02
  • 打赏
  • 举报
回复
很简单呀,

1、注意线程操作控件(非本线程创建)会产生异常,可以考虑使用异步委托的方式。
2、可以使用队列。
2、也可以搞个锁定之类的东西。这不就解决冲突了吗?
zenowolf 2009-07-02
  • 打赏
  • 举报
回复
消息队列是个不错的选择(MSMQ)
边城狂人 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 onlyalone 的回复:]
其它线程通过PostThreadMessage给threadLog发送消息,threadLog里就弄一循环
while(true)
{
MSG msg;
GetMessage(msg);//函数原型不是这样的,去查查
switch(msg.message)
case:
......
}
[/Quote]
PostThreadMessage好像是Windows SDK中的的API吧,在.NET中该如何处理呢?有.NET专用的方法么?
边城狂人 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
写日志时lock一下就可以了,不需要集中在一个线程处理。
[/Quote]
写日志只是举个例,实际是个很复杂的逻辑
happyboyxq 2009-07-02
  • 打赏
  • 举报
回复
委托不是可以跨线程操作吗?用委托就可以了
OnlyAlone 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jamesfancy 的回复:]
引用 3 楼 onlyalone 的回复:
其它线程通过PostThreadMessage给threadLog发送消息,threadLog里就弄一循环
while(true)
{
MSG msg;
GetMessage(msg);//函数原型不是这样的,去查查
switch(msg.message)
case:
......
}


PostThreadMessage好像是Windows SDK中的的API吧,在.NET中该如何处理呢?有.NET专用的方法么?
[/Quote]
dllimport,可以使.net程序中可以调用win32 api。我发了前面那个帖子后去查了下msdn,没找到.NET下发送线程消息的方法,不知道是不是我自己看得不够仔细
cnzdgs 2009-07-01
  • 打赏
  • 举报
回复
写日志时lock一下就可以了,不需要集中在一个线程处理。
aimeast 2009-07-01
  • 打赏
  • 举报
回复
可以用生产消费
q863829288 2009-07-01
  • 打赏
  • 举报
回复
mark
codelabs 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 onlyalone 的回复:]
其它线程通过PostThreadMessage给threadLog发送消息,threadLog里就弄一循环
while(true)
{
MSG msg;
GetMessage(msg);//函数原型不是这样的,去查查
switch(msg.message)
case:
......
}


[/Quote]
正解
OnlyAlone 2009-07-01
  • 打赏
  • 举报
回复
其它线程通过PostThreadMessage给threadLog发送消息,threadLog里就弄一循环
while(true)
{
MSG msg;
GetMessage(msg);//函数原型不是这样的,去查查
switch(msg.message)
case:
......
}

春天的气息 2009-07-01
  • 打赏
  • 举报
回复
线程问题参考一下吧:

http://www.bbs180.com/topictag-14.aspx
ToHai 2009-07-01
  • 打赏
  • 举报
回复
帮顶一个

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧