社区
C#
帖子详情
关于线程的控制,求建议
skyfree
2012-10-10 11:53:10
目前正在做一个Winform的项目,开发环境vs2010.
项目中需要同时开4个线程来进行不同的数据传输, 这4个线程执行时间各不相同, 当4个线程都执行完毕后,进入下一轮数据传输 (还是用4个线程 传输不同的下一轮数据)。 这个过程中,不能block GUI界面。
我的想法用thread pool中4个线程, 用volatile int numberOfFinished 这个变量来检查每一轮4个线程是不是都结束了. 不知道有没有更好的方法。请大家给出意见。谢谢了先。
...全文
1274
52
打赏
收藏
关于线程的控制,求建议
目前正在做一个Winform的项目,开发环境vs2010. 项目中需要同时开4个线程来进行不同的数据传输, 这4个线程执行时间各不相同, 当4个线程都执行完毕后,进入下一轮数据传输 (还是用4个线程 传输不同的下一轮数据)。 这个过程中,不能block GUI界面。 我的想法用thread pool中4个线程, 用volatile int numberOfFinished 这个变量来检查每一轮4个线程是不是都结束了. 不知道有没有更好的方法。请大家给出意见。谢谢了先。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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个线程,控制起来很麻烦。
以专业开发人员为伍
2012-10-12
打赏
举报
回复
[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)
委托实现
线程
外
控制
控件值
网上下载的关于socket通信的例子 但不能运行 发现是控件
线程
外的
线程
的改变了控件值 经过改写用委托实现 已经可以 新手
求
分
UNIX高级编程:第12章
线程
控制
请移步到这里: http://note.youdao.com/noteshare?id=797569d9f0daf39b84a5eed3f5649622&sub=05396B98DAF44650ACC76BE7F90549F0 1
线程
取消
线程
可以通过调用pthread_cancel函数来请
求
取消同一进程中的其他
线程
。 从编程的角度来讲, 不
建议
使用这个接口。 笔者对该接口...
java多
线程
--
线程
停止
测试
线程
停止
建议
线程
正常停止,非强行停止---->利用次数
控制
,不
建议
死循环
建议
使用标志位(flag)—>设置一个标志位 不要使用stop和destroy方法和jdk不
建议
使用的方法 package cn.usts.edu.lesson06; /** * 测试
线程
stop *
建议
线程
正常停止,非强行停止---->利用次数
控制
,不
建议
死循环 *
建议
使用标志位(flag)--->设置一个标志位 * 不要使用stop和destroy方法和jdk不
建议
使用的方法 * .
多
线程
下载策略分析
做毕业设计,想了下多
线程
下载。可是越想越复杂,纠结。 下面是我的一些想法,希望有高手能给点
建议
多
线程
下载
控制
策略: 一、 由一个
控制
线程
负责创建下载子任务,每个子任务由一个
线程
来完成。即一个
控制
线程
不断创建
线程
来完成下载任务。 优点:
控制
线程
可以直接
控制
线程
数量,
控制
线程
超时情况。 缺点:
线程
开销不太容易权衡。如果每个
线程
分配的任务块太小,会导致频繁创建
优化
建议
JAVA优化
建议
1、ArrayList和Vector ArrayList : 有序队列,先进先出,
线程
不安全 Vector:
线程
安全 在多
线程
中要
求
同步时采用vector.addElement(object) 在不需要
线程
同步的情况
建议
使用本身不具备同步的ArrayList等 2、ArrayList LinkedList 对于这两种集合,前者在插入新元素方面性能较
C#
109,884
社区成员
642,647
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章