本帖最后由 maomao85 于 2014-10-09 10:32:50 编辑

解决方案 »

  1.   

    用ManualResetEvent ,自己在man的方法上加try..catch..//启动线程
                Thread th = new Thread(new ThreadStart(() =>
                {
                    while (true)
                    {
                        man.WaitOne();
                        Console.WriteLine("*****");
                    }
                }));
                th.IsBackground = true;
                th.Start();//控制方法的执行、停止
            ManualResetEvent man = new ManualResetEvent(false);
            bool flag = false;
            private void button3_Click(object sender, EventArgs e)
            {
                if (!flag)
                {
                    man.Set();
                    flag = true;
                }
                else
                {
                    man.Reset();
                    flag = false;
                }
            }
      

  2.   

    不是我要的效果啊,ManualResetEvent man = new ManualResetEvent(false)一开始就无信号不对啊。因为一开始我的线程就是要不停执行某件事啊,不能一开始就阻塞在man.WaitOne()
      

  3.   

    你的DoSomeThing如果耗时很长,那么在正在执行的过程中,当然是没办法停下来的
    除非DoSomeThing本身里面也是for循环之类的,你可以在最内层的循环判断你的变量,直接return出来
      

  4.   

    或者你就是要停止一个没有响应了的线程(比如正因为IO通信阻塞中),可以在外部执行
    线程.Abort();
      

  5.   

    把逻辑改一下不就可以了        ManualResetEvent man = new ManualResetEvent(true);
            bool flag = false;
            private void button3_Click(object sender, EventArgs e)
            {
                if (!flag)
                {
                    man.Reset(); 
                    flag = true;
                }
                else
                {
                    man.Set();
                    flag = false;
                }
            }
      

  6.   

    //运行到这,由于cpu的分时,转去执行线程了  看这一段
    相当于还是没有用啊
      

  7.   

    我测试遇到的问题是,我的DoSomeThing执行完了。然后准备执行下一轮的DoSomeThing时,按下了Stop。可是没有及时修改flag,导致下一轮的DoSomeThing还是被执行了。不知道我说明白了没有。
    DoSomeThing函数还在执行中肯定是没法停止的,这点我知道。
    我只是需要还没有执行DoSomeThing的时候,按下Stop是可以及时停止
      

  8.   

    我测试遇到的问题是,我的DoSomeThing执行完了。然后准备执行下一轮的DoSomeThing时,按下了Stop。可是没有及时修改flag,导致下一轮的DoSomeThing还是被执行了。不知道我说明白了没有。
    DoSomeThing函数还在执行中肯定是没法停止的,这点我知道。
    我只是需要还没有执行DoSomeThing的时候,按下Stop是可以及时停止
    这个跟CPU是否分时,还是你弄128个核的CPU,所有线程占有一个核,完全并行,没有任何关系
    你手点的速度,跟CPU执行的速度,能比吗
    你点的稍微慢0.01ms,它就已经开始执行了,懂了?
    除非你在它执行第一次,还没执行完的时候,就已经点下去了,这样它就不执行第二次了
    你想正好卡在第一次和第二次之间点下去,你觉得现实吗?
      

  9.   

    Quote: 引用 9 楼 Z65443344 的回复:

    这个跟CPU是否分时,还是你弄128个核的CPU,所有线程占有一个核,完全并行,没有任何关系
    你手点的速度,跟CPU执行的速度,能比吗
    你点的稍微慢0.01ms,它就已经开始执行了,懂了?
    除非你在它执行第一次,还没执行完的时候,就已经点下去了,这样它就不执行第二次了
    你想正好卡在第一次和第二次之间点下去,你觉得现实吗?[/quote
    你的意思就是在这个时间点按下按钮的概率很低?
      

  10.   

    是的.非常非常低.
    你的代码执行时间应该很长,至少比起两次执行之间的那点缝隙来说是足够长
    而一次执行完,执行下一次,只不过是一个CPU执行周期
    你想在这个时间点上点下按钮并修改变量的值,除非你是超人.
      

  11.   

    你如果想两次执行之间能够操作,起码加个足够长的sleep来允许操作吧
    你这样不断的一次一次执行,怎么可能正好在两次执行之间点下按钮呢
      

  12.   

    你的设计有问题,这样会好的多,但是也不会立即退出while(true)
    {
        if(!flag) break;
        dosometing();
    }线程的立即退出是有可能出现其他错误的,严重的时候导致你的数据丢失。
      

  13.   

    if(flag)
    {
    Thread.Abort();
    }
    flag=false;
    这样不挺好的
      

  14.   

    线程退出就好比寿终正寝,而强制Abort就跟枪杀一样,是很暴力的做法
    你应该通知它:你快死了,赶紧写好遗嘱,买好棺材,然后找个人把你埋了
    而不是不管三七二十一,一枪打死,然后再想办法给它擦屁股
      

  15.   

    好象线程自己没有立即停止的办法,除非线程外部强行终止,用TerminateThread Function
      

  16.   

    这样好在哪里?请指教?
    这样写,好处就是,你可以在不同的地方执行break,而不一定每次都必须完整的执行完一次才能结束
      

  17.   

    滥用“无限循环”的习惯会让你的 UI 程序反应很慢、“卡得令人受不了”,而这个时候你再去纠结“按下Stop后及时改变flag”,这就是恶性循环了。
      

  18.   

    无限循环其实也没那么可怕吧,很多时候还是需要用到的
    比如我就做个检测丢包率的软件,按下开始就不断的发送接收,或者干脆就是不断的ping,按下停止结束并计算丢包率
    这里用while没什么问题吧
      

  19.   

    @Z65443344,这位同行诠释的很好,楼主试图和CPU分时比速度,如你你赢,你自己则就是一台超级计算机。
      

  20.   

    其实我是个for循环,只是for循环里面的DoSomeThing比较耗时。
      

  21.   

    这样一点都不好
    如果线程里有跟数据库通信,或线程里调用了非托管资源
    你这样直接强制退出,会产生一堆问题的
    应该先通知线程:你应该退出了
    然后线程把该释放的释放,该关闭的关闭,再自己退出我是做的一个xy水平平台动作的,在点到点运动的过程中。判断到了定点就停止 用的这个abort。好不好
      

  22.   


    你的业务逻辑到底是否要关心“退出”标志呢?如果不关心,那么它是否关心“安全结束”呢?还是任何语句抛出了异常,也当作没看见bug呢?
      

  23.   

    非结构化编程是什么?非结构化,这个词是杜撰,呵呵
    所谓结构化,就是单步调试能够一步步下来的;非结构化,就是直接F10(visual studio),不能按照你的意愿跳转代码。
      

  24.   

    肯定关系退出啊。我是一个for循环,一次一次的向硬件设备发https请求来完成一些信息的交互。
    肯定得安全结束。
    点stop就是表示停止这个for循环