c# 多线程问题 高手进

gh57897053 2008-10-14 12:35:45
我现在在写个UDP端口扫描,我想每次都启动200个线程对200个端口发包,这样比较有效率,清问我下面的写法吗?
while (i < 200)//(假设)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(UDP),i);
i++;
}
或者
for(i=0;i<200;i++)
{
Thread t=new Thread(new ParameterizedThreadStart(UDP));
t.Start(i);
}
这样是建立200个线程么?如果不是该怎么做?
...全文
121 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
supawei 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Gregorian 的回复:]
在以下几种情况下,适合于创建并管理自己的线程而不是使用线程池线程:
需要前台线程。
需要使线程具有特定的优先级。
您的任务会导致线程长时间被阻塞。由于线程池具有最大线程数限制,因此大量阻塞的线程池线程可能会阻止任务启动。
需要将线程放入单线程单元。所有 ThreadPool 线程均处于多线程单元中。
您需要具有与线程关联的稳定标识,或使某一线程专用于某一任务。

最大线程池线程数
可排队到线程池的操作数仅受…
[/Quote]
这个总结非常到位.
  • 打赏
  • 举报
回复
这都是建立了200线程。一个是200个单独的线程。一个是用线程池管理的。
Gregorian 2008-10-14
  • 打赏
  • 举报
回复
在以下几种情况下,适合于创建并管理自己的线程而不是使用线程池线程:
需要前台线程。
需要使线程具有特定的优先级。
您的任务会导致线程长时间被阻塞。由于线程池具有最大线程数限制,因此大量阻塞的线程池线程可能会阻止任务启动。
需要将线程放入单线程单元。所有 ThreadPool 线程均处于多线程单元中。
您需要具有与线程关联的稳定标识,或使某一线程专用于某一任务。

最大线程池线程数
可排队到线程池的操作数仅受可用内存的限制;但是,线程池限制进程中可以同时处于活动状态的线程数。默认情况下,限制每个 CPU 可以使用 25 个辅助线程和 1,000 个 I/O 完成线程。
通过使用 GetMaxThreads 和 SetMaxThreads 方法可以控制最大线程数。
gh57897053 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiaoyaxin 的回复:]
首先,你得搞明白什么是线程池。你向线程池添加200根线程任务不代表线程池就会分配200根线程。添加后你的
任务只是排列在队列里等候执行。操作系统会依据现有的资源占用情况来动态的分派线程来执行你的任务。

[/Quote]
发现这个问题了,我用ThreadPool.GetAvailableThreads(out i,out j)去获取当前可用的线程,发现i一直是等于199,也就是系统只分配了1个线程,不知道这样理解对不对。
先谢谢上面几位给我提出的建议
Big鹏 2008-10-14
  • 打赏
  • 举报
回复

不建议楼主开这么多线程,
CPU频繁在200个线程间切换,有的时候很多线程都是用不上的,后面楼主还得考虑线程同步的问题。
其实楼主可以动态地输入以决定开启多少个线程。
supawei 2008-10-14
  • 打赏
  • 举报
回复
首先,你得搞明白什么是线程池。你向线程池添加200根线程任务不代表线程池就会分配200根线程。添加后你的
任务只是排列在队列里等候执行。操作系统会依据现有的资源占用情况来动态的分派线程来执行你的任务。
yinzheng529 2008-10-14
  • 打赏
  • 举报
回复
up
qq465999214 2008-10-14
  • 打赏
  • 举报
回复
线程用的太多,不一定会提高效率,因为 cpu 要频繁的在 线程之间 切换,同样需要消耗性能!
gh57897053 2008-10-14
  • 打赏
  • 举报
回复
如何判断线程池中的线程已经运行完毕?
有办法让一个线程结束后才启动另个线程?

110,561

社区成员

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

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

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