none
关于线程终止问题。。。 RRS feed

  • 问题

  • 启动一个线程去做事。当事情做完了这个线程需要手动关闭吗?还是它闲置了就自己关闭了?
    如:
    我启动一个程序后他自动去获取某网页上的内容。内容获得完后。这个线程在什么时候关闭?

    delegate void DelegateVoid();
    Thread thread;
    
    private void frmMain_Load(object sender, EventArgs e)
    {
        DelegateVoid d = new DelegateVoid(this.getHtml);
        thread = new Thread(new ThreadStart(d));
        thread.Start();
    }
    
    private void getHtml()
    {
        string s = "{获取网页内容}";
        this.txtBox1.text = s;
    }
    2009年7月21日 10:01

答案

全部回复

  • 你好,线程执行完毕后会自动关闭,至于什么时候无法确定,由线程调度器决定,不过执行完了就会关闭,没有执行完就会继续等待!
    jon.valett@gmail.com
    2009年7月21日 10:49
    版主
  • 建议能够显式关闭的话,还是及时地、显式地关闭它。
    因为,GC的回收机制,比较复杂,不能保证立马关闭,往往采用的是轮询方式,当发现时,才进行回收。
    比如数据库链接,也是这个道理,建议用完即关。

    http://hi.baidu.com/2009ajun
    2009年7月21日 12:01
  • 如果你不需要对线程进行控制的话!可以直接拿一个线程池里面线程!干完活后线程池会自动回收!

    2009年7月22日 1:47
  • 建议直接用线程池来做
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年7月22日 1:53
    版主
  • 建议直接用线程池来做
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond

    线程池没玩过呢,可不可就这个例子写一下?
    2009年7月22日 2:17
  • using System;
    using System.Threading;

    class App {
    static void Main() {
    Console.WriteLine("Main thread: Queuing an aynchronous
    operation.");
    ThreadPool.QueueUserWorkItem(new WaitCallback(MyAsyncOperation));

    Console.WriteLine("Main thread: Performing other operations.");
    // ...

    Console.WriteLine("Main thread: Pausing to simulate doing other
    operations.");
    Console.ReadLine();
    }

    // The callback method's signature MUST match that of a
    // System.Threading.WaitCallback delegate (it takes an
    // Object parameter and returns void)
    static void MyAsyncOperation(Object state) {
    Console.WriteLine("ThreadPool thread: Performing aynchronous
    operation.");
    // ...
    Thread.Sleep(5000); // Sleep for 5 seconds to simulate doing
    // work

    // Returning from this method causes the thread to
    // suspend itself waiting for another task
    }
    }

    jon.valett@gmail.com
    2009年7月22日 2:33
    版主
  • using System;
    using System.Threading;

    class App {
    static void Main() {
    Console.WriteLine("Main thread: Queuing an aynchronous
    operation.");
    ThreadPool.QueueUserWorkItem(new WaitCallback(MyAsyncOperation));

    Console.WriteLine("Main thread: Performing other operations.");
    // ...

    Console.WriteLine("Main thread: Pausing to simulate doing other
    operations.");
    Console.ReadLine();
    }

    // The callback method's signature MUST match that of a
    // System.Threading.WaitCallback delegate (it takes an
    // Object parameter and returns void)
    static void MyAsyncOperation(Object state) {
    Console.WriteLine("ThreadPool thread: Performing aynchronous
    operation.");
    // ...
    Thread.Sleep(5000); // Sleep for 5 seconds to simulate doing
    // work

    // Returning from this method causes the thread to
    // suspend itself waiting for another task
    }
    }

    jon.valett@gmail.com

    看例子线程池都带一个参数(Object state) ,如果我的方法没有参数,或者有N个参数咋办?
    2009年7月22日 2:47
  • 你好,如果没有参数,传入Null就可以了,如果N个参数,传入一个集合类的对象就可以了。
    jon.valett@gmail.com
    2009年7月22日 2:53
    版主
  • 查msdn  使用异步方式调用同步方法   这种方式也可以!
    知识在于积累!
    2009年7月22日 2:53
  • 还真是麻烦。貌似线程池最大只能容纳25个线程?如果有上百个咋办?
    2009年7月22日 3:03
  • 查msdn  使用异步方式调用同步方法   这种方式也可以!
    知识在于积累!

    异步方式调用同步方法?不明白
    2009年7月22日 3:04
  • msdn上讲的比较详细!也有例子!自己去查一下吧!
    知识在于积累!
    2009年7月22日 3:07
  • 还真是麻烦。貌似线程池最大只能容纳25个线程?如果有上百个咋办?

    如果多了,.net会让线程排队,让.net来帮您管理线程,这样性能会得到最优的效果。
    2009年7月22日 3:16
  • 查msdn  使用异步方式调用同步方法   这种方式也可以!
    知识在于积累!

    异步方式调用同步方法?不明白
    异步调用是基于委托的。之前有讨论过,请参考:http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/04acf483-5ff6-4f74-972d-3b26ef5ac31b
    2009年7月22日 3:17
  • 你好,线程不是越多越好,会吃不消的!线程池适合做任务时间短的事情!
    jon.valett@gmail.com
    2009年7月22日 3:20
    版主
  • 你好,线程不是越多越好,会吃不消的!线程池适合做任务时间短的事情!
    jon.valett@gmail.com

    那如果任务时间长的用什么比较好?
    比如:服务器监控系统,每隔几秒向服务器的某个端口发socket包。全天候监控。
    每隔端口用一个线程去监控。避免这个线程死掉不影响其他服务器或端口的监控。

    一个服务器有N个端口要监控,那么N个服务器的话那线程可就多了去了。
    要一直开着。发现不通过后可能还会开新线程发邮件通知啥的。
    这种情况下怎么才会最优?
    2009年7月22日 3:34
  • 你好,线程不是越多越好,会吃不消的!线程池适合做任务时间短的事情!
    jon.valett@gmail.com

    那如果时间长的任务怎么办?
    比如:
    一个服务器监控系统,每隔几秒就要向服务器的某端口发SOCKET包,有回执则通反正不通。
    要7X24小时不间断的监控。

    为了避免线程死掉不影响对其他服务器或端口的监控。所以每个服务器的每个端口都开一个线程去监控。

    当有N个服务器的话那线程可就多了去了。再加上如果发现不通的话还会开新线程去发邮件通知啥的。

    这样的话要怎么做比较好?
    2009年7月22日 3:38
  • 你好,任务时间长可以使用Thread,而不要使用TreadPool,Thread自主控制权利比ThreadPool大很多。

    建议你不要一个端口霸占一个线程,这个设计不好,你可以开启一定数量的Tread去轮循监控,至于多少,你可以通过配置不同的数量来监控CPU的性能变化,充分利用CPU。
    jon.valett@gmail.com
    2009年7月22日 3:42
    版主
  • 您好,线程池中实际上有两种线程:工作线程和完成端口线程。
    您提到的25个是指每cpu下的工作线程,看您的需求是完成端口线程,该线程数的默认值是1000。
    当然您还可以通过ThreadPool类的SetMaxThreads方法来修改最大线程数,但不建议您随意修改这个最大数。
    线程并不是越多约好,如果没有工作负载,大量闲置的线程的上下文切换反而会带来很多的性能损耗。
    关于您如何优化的问题,并没有一个标准,线程的数量多少是需要通过您当前的需求场景来做性能测试确定的。
    建议您先收集需求,设定场景进行性能测试,同时把线程数的大小设定值放在config文件中。以方便测试。
    2009年7月22日 3:54
  • 你好!你可以采用长连接方式
    知识改变命运,奋斗成就人生!
    2009年7月22日 3:57
    版主
  • 你好!你可以采用长连接方式
    知识改变命运,奋斗成就人生!

    请问什么是长连接方式?
    2009年7月22日 4:06
  • http://www.google.cn/search?hl=zh-CN&newwindow=1&q=什么是长连接&btnG=Google+搜索
    知识改变命运,奋斗成就人生!
    2009年7月22日 4:57
    版主
  • 应该搞清楚什么是进程、什么是线程,像24*7的长时间不停歇的监控程序,应该用进程的方式来实现呢。
    http://hi.baidu.com/2009ajun
    2009年7月25日 0:45
  • 一个线程就可以解决的,为什么要弄那么多线程呢?在子线程里用引发事件的方式让主线程去监控,而不是弄一大堆线程摆在系统里.主线程如果死了,子线程再多也是枉然.
    建议的这种方式可能需要用到Lock,以避免过快引发的事件出错.


    2009年9月27日 13:55
  • 加上thread.Join();

    DelegateVoid d = new DelegateVoid(this.getHtml);
    thread = new Thread(new ThreadStart(d));
    thread.Start();
    thread.Join();

    2009年9月29日 5:07
  • 怎么觉得这个问题大家越回答越复杂啊。

    C#中,启动一个线程要一个线程函数,比如楼主的getHtml。启动线程就是执行这个函数,这个函数执行完了,线程就结束了。进一步的问题,其实程序员不必关心。

    另外你这个程序可以运行么?我怎么记得getHtml中不能直接修改文本框的内容,必须要Invoke。
    Cheers, Cedric
    2009年10月6日 14:18