关于线程的控制,求建议

skyfree 2012-10-10 11:53:10
目前正在做一个Winform的项目,开发环境vs2010.
项目中需要同时开4个线程来进行不同的数据传输, 这4个线程执行时间各不相同, 当4个线程都执行完毕后,进入下一轮数据传输 (还是用4个线程 传输不同的下一轮数据)。 这个过程中,不能block GUI界面。

我的想法用thread pool中4个线程, 用volatile int numberOfFinished 这个变量来检查每一轮4个线程是不是都结束了. 不知道有没有更好的方法。请大家给出意见。谢谢了先。
...全文
1278 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
camelxue 2012-10-16
  • 打赏
  • 举报
回复
可以再启动一个总的控制线程,控制线程中使用4个线程的Join()函数。
天高愉悦 2012-10-15
  • 打赏
  • 举报
回复
你可以测试提到几种方法,然后看看在你的环境里边那个快……至于优雅。。这见仁见智了,有人觉得功能强大才是优雅,有人觉得高效简洁才是优雅,看你的需求了。
你可以评估一下你的项目规模和未来的发展,想想为了优雅耗费那么多时间到底值不值得……开发者的时间应该要考虑进成本中……如果只是为学习的话就当我什么都没说过~~LZ加油
niss 2012-10-15
  • 打赏
  • 举报
回复
绕来绕去,楼主的意思其实不是关于线程的,而是关于异步的,用异步类,或者用线程写一个异步类,楼主想要的就是用几行代码甚至一行代码加一个函数就能搞定的异步操作
wuyue976 2012-10-14
  • 打赏
  • 举报
回复
CSDN的积分是什么东西
skyfree 2012-10-14
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 的回复:]

都不看windows api
另开一线程调用waitformultipleobjects,具体去找MSDN,windows核心编程也行。
[/Quote]
这个基本知识我早就知道了,我在这里是征集最佳方案。 用一个单独的线程来waitformultipleobjects的话, 传输线程等还要和 UI线程交互 。 这样有6个线程,控制起来很麻烦。
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
这个方法我也想过,但是要保证UI的响应,必须开另外一个控制线程,在控制线程中来处理四个线程。[/Quote]

为什么要“另开一个控制线程”呢?你的这四个线程是谁开的?
soaringbird 2012-10-12
  • 打赏
  • 举报
回复
在哪里创建传输线程,这个并不妨碍你在UI上显示进度,
skyfree 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 的回复:]

你不看我22楼的回复?你再造一个调度线程啊
[/Quote]
soaringbird,你好。 在调度线程里创建和同步四个传输的子线程有如下的问题:主线程UI要动态的显示各个传输线程的进度条。这要求每个传输的子线程要通过UI的TaskScheduler/SynchronizationContext来刷新UI线程。 在控制线程中创建和协调传输子线程就没法实现刷新UI线程。 不知道有没有更好的方法。
soaringbird 2012-10-12
  • 打赏
  • 举报
回复
你不看我22楼的回复?你再造一个调度线程啊
skyfree 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 的回复:]

你去搜一下WaitHandler.WaitAll()的用法就会了
主线程中声明WaitHandle[] finishedEvts = new WaitHandle[4]; //new ManaulResetEvent(false)
4个子操作中执行完后Set()
主线程将子操作全部排入UserWorkQueue之后,
调用WaitHandler.WaitAll(finishedEvts,……
[/Quote]

这个会阻塞主线程UI,不可行。 目前主线程UI不允许任何形式的阻塞,问题难点在这里呀。
skyfree 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 的回复:]

可以用一个变量来记录线程执行的次数,每次线程执行完后变量个数+1,当变量个数达到指定值(比如4)的时候,重新将变量置为0,然后再开线程执行,做好同步就可以了
[/Quote]

这个方法是可以的,前面的tx也都给出了这个方法,但感觉不好,不知道有没有更优雅的方法来控制
lixin2732r 2012-10-12
  • 打赏
  • 举报
回复
最头疼线程的东西了 帮顶
星火燎猿 2012-10-12
  • 打赏
  • 举报
回复
帮顶...
龙泉剑 2012-10-12
  • 打赏
  • 举报
回复
可以用一个变量来记录线程执行的次数,每次线程执行完后变量个数+1,当变量个数达到指定值(比如4)的时候,重新将变量置为0,然后再开线程执行,做好同步就可以了
skyfree 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 的回复:]

引用 17 楼 的回复:
这个方法我也想过,但是要保证UI的响应,必须开另外一个控制线程,在控制线程中来处理四个线程。

为什么要“另开一个控制线程”呢?你的这四个线程是谁开的?
[/Quote]
四个线程是主线程(UI线程)开的,但如果在UI线程中控制同步(比如用wait/join/sleep),会阻塞UI的响应,这是不允许的。所以要在另外一个线程中来进行同步控制。
但这种方法感觉不好,不知道你有什么建议?谢谢了
skyfree 2012-10-12
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 的回复:]

引用 17 楼 的回复:
这个方法我也想过,但是要保证UI的响应,必须开另外一个控制线程,在控制线程中来处理四个线程。

不懂什么意思。为什么要“另外四个线程”?
[/Quote]

如果在UI线程中Wait/Join/Sleep,会阻塞UI的响应。 如果在控制线程中创建四个子线程,和UI线程的交互(比如显示进度条信息)就会成问题。
skyfree 2012-10-12
  • 打赏
  • 举报
回复


[Quote=引用 22 楼 的回复:]

引用 4 楼 的回复:

这些方法适用于单个线程的管理,我现在主要的问题是: 要在前一轮4个线程都结束后,再开始下一轮的4个线程,这个如何控制?

先开一个线程,处理数据轮次的循环,在循环里开这四个线程,处理各自的数据,四个线程都开始执行后,都用Join()等待执行完毕,然后进入下一轮。
[/Quote]

问题是:在主线程(UI线程)中使用join会阻塞界面响应。包括用WaitAll(),WaitForMultipleObjects API ,什么的也都是这个问题。
lght 2012-10-12
  • 打赏
  • 举报
回复
都不看windows api
另开一线程调用waitformultipleobjects,具体去找MSDN,windows核心编程也行。
tigerii 2012-10-12
  • 打赏
  • 举报
回复
JerryWJH,有关线程:
1)数据的线程安全
2)线程同步
3)死锁
因为主线程/UI操作通常是线程不安全的,所以,.net使用线程同步来解决。关于主线程/UI和子线程同步的例子很多,你搜索一下就找到了。
#10楼,使用信号量,很好的解决了你需要4个线程同步,建议每个线程判断:WaitHandle.WaitAll(evnt1到4的数组).....。这样,不需要控制线程。
skyfree 2012-10-12
  • 打赏
  • 举报
回复
.net中的线程控制感觉怎么比Windows本身还麻烦,已经习惯了用Win API来做。现在看.net中这么多方案,没有一个有足够的灵活性的。
加载更多回复(31)

110,656

社区成员

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

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

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