问一个关于线程池的问题

antoniusguo 2009-09-28 10:28:21
线程池中的线程,执行完以后怎么处理?挂起?还是怎么?

我在工作线程中保存当前线程到静态变量,过了10秒在看,发现是Background?
...全文
168 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
fpcc 2009-09-29
  • 打赏
  • 举报
回复
这个看你怎么用,如果你自己写线程池,你可以自动控制,如果你使用NETFRAME自已带得,你就 要看MSDN了,特别提醒你,可以看一下WINDOWS核心编程,这里面详细解释了如何使用2000后平台上的线程池。
antoniusguo 2009-09-28
  • 打赏
  • 举报
回复
如果保留,那这个线程怎么留下来?线程代码执行完就自动跳出了,难道是别的线程做了while循环?里面调用了委托?
mythad 2009-09-28
  • 打赏
  • 举报
回复
mark.
qldsrx 2009-09-28
  • 打赏
  • 举报
回复
为什么不查看线程的IsAlive属性?IsBackground 属性看了没有意义啊,肯定是Background的。
ViewStates 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guoyichao 的回复:]
线程池内的线程执行完后根据线程池的min这个值决定这个线程是否被销毁还是保留,如果当前线程数大于min,线程就被销毁掉,否则就保留。
[/Quote]
应该是MAX吧?
这个貌似是MIN决定最少线程数,因为在线程之间切换是个消耗很大的过程。
MAX是决定最大线程数,超过的一律以队列形式FIFO
guoyichao 2009-09-28
  • 打赏
  • 举报
回复
线程池内的线程执行完后根据线程池的min这个值决定这个线程是否被销毁还是保留,如果当前线程数大于min,线程就被销毁掉,否则就保留。
鸭梨山大帝 2009-09-28
  • 打赏
  • 举报
回复
1.线程池中的线程,执行完以后怎么处理?挂起?还是怎么?
<==執行完畢會自動退出

2.我在工作线程中保存当前线程到静态变量,过了10秒在看,发现是Background?
<==Background?沒明白
24K純帥 2009-09-28
  • 打赏
  • 举报
回复
每个传入请求都将分配给线程池中的一个线程,因此可以异步处理请求,而不会占用主线程,也不会延迟后续请求的处理.一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用。
qldsrx 2009-09-28
  • 打赏
  • 举报
回复
线程一旦终止,它就无法通过再次调用 Start 来重新启动。

如果你想再次执行,还不如使用定时器,System.Threading.Timer 类既是多线程执行的,也可以重复执行,或者说它就没有终止状态,任何时候都可以停,任何时候都可以开启。
much0726 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yuxuanji 的回复:]
引用 4 楼 qldsrx 的回复:
为什么不查看线程的IsAlive属性?IsBackground 属性看了没有意义啊,肯定是Background的。

up
线程池的所有线程都是后台线程
[/Quote]
UP
LutzMark 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qldsrx 的回复:]
为什么不查看线程的IsAlive属性?IsBackground 属性看了没有意义啊,肯定是Background的。
[/Quote]
up
线程池的所有线程都是后台线程
antoniusguo 2009-09-28
  • 打赏
  • 举报
回复
问下,线程执行完以后,该线程是否还能再用?
qldsrx 2009-09-28
  • 打赏
  • 举报
回复
线程等待就一种,用Thread.Sleep方法,线程执行完不代表线程对象的销毁,线程对象还存在,并可以检索,如果你使用静态变量存放线程对象,那么它就不会被C#垃圾回收,只有当你释放了所有的引用,才会被垃圾回收。
guoyichao 2009-09-28
  • 打赏
  • 举报
回复
上面写的有点错误,Semaphore拼错了,int num = pool.Release()这里不能用Release来获得剩余资源需要自己做一个资源计数。

guoyichao 2009-09-28
  • 打赏
  • 举报
回复
伪代码
private Samephore pool;
Action a;
int min, max;

void ThreadPoolInit(int min, int max)
{
this.min = min;
this.max = max;
pool = new Samephore(0, max);

for (int i = 0; i <= min; ++i)
{
Thread t = new Thread(p);
t.IsBackground = true;
t.Start();
}
}
void p()
{
while(true)
{
pool.WaitOne();
Action t;
if (a != null)
{
lock (a)
{
if (a != null)
{
t = a;
}
}
}
if (t != null) t();
int num = pool.Release();
if (num > min) break;
}
}

void QueueWork(Action d)
{
//省略了max检查及新线程创建

lock (a)
{
a = d;
}

pool.Release();
}
rungoosc 2009-09-28
  • 打赏
  • 举报
回复
这个循环是一个监控。它是主线程上的。


这里我加了一个 System.Threading.Thread.Sleep(100);
是让每隔100毫秒再执行下一次检查。否则CPU会占用率非常高
antoniusguo 2009-09-28
  • 打赏
  • 举报
回复
while (true)
{
if (hasError || successnum == SiteObj.FilePairList.Count)
return hasError ? false : true;
System.Threading.Thread.Sleep(100);
}



个人认为线程池中的线程是不需要消耗CPU的吧
rungoosc 2009-09-28
  • 打赏
  • 举报
回复
这就是一个代码片段。意思是通过一个委托去创建了多个线程。创建完以后进入一个while循环监控。 线程执行过程会更新 hasError 和 successnum。
当所有线程执行完 successnum == SiteObj.FilePairList.Count 或 出错 hasError 时。退出循环。

antoniusguo 2009-09-28
  • 打赏
  • 举报
回复
楼上的代码里有些莫名其妙的变量。。。。
rungoosc 2009-09-28
  • 打赏
  • 举报
回复

private bool BackupSite()
{
successnum = 0;
if (UploadTrace.IsTaskCancel(block))
{
return false;
}
try
{
for (int i = 0; i < file.Length; i++)
{
doBackup t2 = new doBackup(this.BackSiteThread);
t2.BeginInvoke(i, new AsyncCallback(doBackupCallBack), t2);
}
}
catch (Exception ex)
{
return false;
}

while (true)
{
if (hasError || successnum == SiteObj.FilePairList.Count)
return hasError ? false : true;
System.Threading.Thread.Sleep(100);
}
}
private delegate void doBackup(int threadid);
private void doBackupCallBack(IAsyncResult IAR)
{

doBackup t2 = (doBackup)(IAR.AsyncState);
t2.EndInvoke(IAR);
t2.Clone();
}
加载更多回复(3)

110,533

社区成员

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

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

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