日期:2014-05-17  浏览次数:20946 次

问个线程生命周期的问题
C# code

private void Form_Load(object sender, EventArgs e)
{
    Thread thread = new Thread(Open);
    //thread.IsBackground = true;后台线程的作用是什么?有什么区别
    thread.Start();
}
private void Open()
{
    //DoSomeThings;
    //DoSomeThings;
    //DoSomeThings;
}



想请问一下:
1.这个线程的生命周期到open方法执行完就自动死亡了吗?还是要使用abort来结束?
2.这个线程是全局的,声明到外面去,有个定时器,每隔一段时间就new Thread(Open)然后Start(),在保证open方法能执行完之后才会new Thread,会不会导致有很多线程还是说始终只有一个线程?
3.IsBackground的作用是什么?有什么区别?

谢谢大家!

------解决方案--------------------
1.这个线程的生命周期到open方法执行完就自动死亡了吗?还是要使用abort来结束?
执行完 Open() 函数自动结束

2.这个线程是全局的,声明到外面去,有个定时器,每隔一段时间就new Thread(Open)然后Start(),在保证open方法能执行完之后才会new Thread,会不会导致有很多线程还是说始终只有一个线程?
启动一次就会增加一个新的线程(同时,之前的线程执行完毕会自动销毁)

3.IsBackground的作用是什么?有什么区别?
同问

------解决方案--------------------
IsBackground 估计会影响线程的优先级。设为true优先级会更低一些。
纯猜测
------解决方案--------------------
IsBackground标明是否是后台线程。
具体见MSDN。

程序关闭的时候会等待所以前台线程结束,前台线程都结束之后会自动关闭后台线程。
------解决方案--------------------
1.这个线程的生命周期到open方法执行完就自动死亡了吗?还是要使用abort来结束?

并不是open方法执行完就自动死亡,而是open方法执行完这个线程就没事了,至于什么时候死亡这个在你不干预的时候是自动决定的,并不是马上死亡。
------解决方案--------------------
什么叫尽快结束?那就是外界强制终止呗。abort出异常是对的,本来这个操作就应该出异常。
------解决方案--------------------
正确的方法不是强制结束线程,而是在线程内加入消息处理,接受到某特定消息则中断循环等等然后自我退出
想让它结束,发个消息就行了
------解决方案--------------------
这些问题不错啊,mark下,个人见解
1,据说不会自动销毁,而是在线程池中挂起,当线程池满的时候,才会销毁
2,如果要保证资源同时只有一个线程访问,用lock吧
3,IsBackgroud表示是否后台进程,true的话会线程随着宿主的销毁而销毁,反之会影响程序结束
------解决方案--------------------
探讨
这些问题不错啊,mark下,个人见解
1,据说不会自动销毁,而是在线程池中挂起,当线程池满的时候,才会销毁
2,如果要保证资源同时只有一个线程访问,用lock吧
3,IsBackgroud表示是否后台进程,true的话会线程随着宿主的销毁而销毁,反之会影响程序结束

------解决方案--------------------
http://technet.microsoft.com/zh-cn/library/system.threading.thread.isbackground(v=VS.95)