场景是持续不断的去检测是否有新版本更新,如果发现了,立马执行一些事情。这块代码如下:
while(flag)//flag是个bool类型的标签,用于控制循环
{
    foreach (var item in list)
    {
        遍历集合do somesing
    }    Thread.Sleep(time);//设置一个sleep时间,就是检查间隔。
}
然后设置一个停止按钮//先判断当前线程状态
 bool orderThworking = true;            flag = false;            while (orderThworking)
            {                    txtLog.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff") + "     线程状态:" + orderTh.ThreadState + "\r\n");
                if (orderTh.IsAlive == false)
                {
                    说明线程停止了,释放资源操作
                }                Thread.Sleep(300);
            }现在的问题是,当线程在执行中,有个sleep时间,在这个线程等待(或者睡眠)时,无法唤醒退出,就会导致,点击了停止按钮后,线程还会执行一段时间,应该怎么做才能实现:点击停止按钮,立马结束循环中执行的事情呢(就是第一段代码里的do someing)。谢谢!

解决方案 »

  1.   

    Thread.Abort,你这个还是选择用定时器做吧放弃死循环
      

  2.   

    不用sleep,用线程timer,System.Threading.Timer
    具体用法自己搜下
      

  3.   

    网上的例子里面,常用sleep模拟耗时操作,那是为了说明问题,现实中尽量少用
    在windows里,sleep后,要重新竞争CPU处理,那是给自己添堵
      

  4.   

    你的线程可以立马结束的话,考虑使用abort方法
    也可以用task,CancelLationTokenSource类
      

  5.   

    最好是在代码中检查是否要求结束,比如CancelLationTokenSource和await来代替Thread.Sleep
      

  6.   


    abort方法我最开始就放弃了,因为这个不优雅,而且是通过抛异常的方式来,我的程序中前面有try,如果用abort还得再处理这个线程的异常,比较麻烦,所以才用了flag的形式。
      

  7.   


    感谢,await方法我用过,感觉不是特别熟悉,再去研究研究。