线程中启动一个timer及时,到了时间,就线程自己退出

解决方案 »

  1.   

    有没有简便的做法?ThreadPool是否提供这方面的支持呢?因为我只是希望后台执行一段小程序而已,没必要定义Thread加Timer这么麻烦吧?能不能想ThreadPool一样一个静态方法搞定呢?
      

  2.   


    你怎样强行终止线程?不要说你看到过线程有个“Abort”方法就以为搞定了吧?!
      

  3.   

    就比方说咯,输入一个数据库连接字符串,一个测试按钮,点击后执行数据库连接测试,由于在网络不通畅的情况下ADO.NET连接数据库非常耗时,要几分钟的时间,我可不想客户点了这个按钮后要等这么久才能再修改连接字符串再做测试,万一又不对,不是又要熬上几分钟时间?你换位思考一下,要你这么做你也想死吧
      

  4.   

    不要老想着怎么强制取消一个任务或者终止一条线程。ThreadPool也根本不支持这种操作,更别说什么到了一定时间自动取消了。
    线程倒是有个Abort()方法,不过功能也是非常有限的,只有当控制权在CLR的时候才能终止线程。也就是只有当线程在执行托管代码的时候才能终止线程,如果代码已经运行到非托管代码中去了,比如你已经进入到处理数据库连接的非托管代码了,Thread.Abort()是无能为力的。你要的效果当然可以实现,但不是以你想的那种方法。比如数据库连接,首先它自己就支持设置超时时间,你何必要搞一出强制终止线程的戏呢。
    其次,就算是为了程序的响应度,连几秒钟都不想阻塞,你也是连线程都用不着创建。Connection对象自带OpenAsync方法用于异步连接,这个方法还可以接收一个CancellationToken,让你可以主动请求取消连接。而CancellationTokenSource又支持在一定时间后自动发出取消请求,你的问题不就迎刃而解了。
                var con = new System.Data.SqlClient.SqlConnection();
                // 2000ms后自动发出取消请求
                CancellationTokenSource cts = new CancellationTokenSource(2000);
                try
                {
                    con.OpenAsync(cts.Token);
                }
                catch (Exception)
                {
                }网路操作也是一样的。有人“喜欢”开一条线程去调用WebClient.DonwLoadString()之类的同步函数,然后发现Thread.Abort()终止不掉,大呼坑爹。其实WebClient本身就提供了异步下载函数和用于取消异步下载的CancelAnsyc()函数。这些是.NET框架中自带类型的例子。
    如果你希望自己定义的某些操作也可以取消,你就要把这个操作设计和实现为可以主动取消。而不是投机取巧考虑用一个线程来执行这个操作,然后要取消的时候就终止线程什么的。
      

  5.   

    如果你的任务主要是使用.NET框架的某些类型,那么应该从这些类型自身提供的取消机制入手。
    如果你的任务主要是执行自定义代码,应该从把这些代码设计和实现为可以取消入手。
      

  6.   

    可以使用信号变量来控制,比如AutoResetEvent的WaitOne方法定义下超时时间。