/// <summary>
        /// 递增方法
        /// </summary>
        public static void doAdd()
        {
            //string threadID = "threadID:doAdd:" + Guid.NewGuid() + ":" + Thread.CurrentThread.ManagedThreadId.ToString();            //Console.WriteLine(threadID);            int i = 0;            Thread thread = new Thread(delegate (object param)
            {                // 等待“停止”信号,如果没有收到信号则执行                 while (!canStop)
                {
                    Console.WriteLine(i++);
                    Thread.Sleep(1000);
                }                // 此时已经收到停止信号,可以在此释放资源并 
                canStop = false;            });            thread.Start();//启动线程                }
点击按钮调用此方法,再点击时需关闭之前点击时启动的线程,如何实现

解决方案 »

  1.   

    你不是使用 canStop 标志吗?
      

  2.   


    然儿结果却是这样,不知道是那里写的不对还是怎么的
    调用的地方是这么写的 DelegateThread delegateThread = new DelegateThread(DelegateThread.doAdd);
                Thread th = new Thread(new ThreadStart(delegateThread.DoSomeThing));  
                th.IsBackground = true;
                th.Start();
      

  3.   

            bool canStop=false;
            public static void doAdd()
            {
                //string threadID = "threadID:doAdd:" + Guid.NewGuid() + ":" + Thread.CurrentThread.ManagedThreadId.ToString();            //Console.WriteLine(threadID);            int i = 0;
    if(!startTR){
                Thread thread = new Thread(delegate (object param)
                {                // 等待“停止”信号,如果没有收到信号则执行                 while (true)
                    {
                    if(startTR)
                    break;
                        Console.WriteLine(i++);
                        Thread.Sleep(1000);
                    }            });            thread.Start();//启动线程  
                }              }
            public static void 结束线程(){
            canStop=true;
            }
      

  4.   

            bool canStop=false;
            public static void doAdd()
            {
                //string threadID = "threadID:doAdd:" + Guid.NewGuid() + ":" + Thread.CurrentThread.ManagedThreadId.ToString();            //Console.WriteLine(threadID);            int i = 0;
    if(!canStop){
                Thread thread = new Thread(delegate (object param)
                {                // 等待“停止”信号,如果没有收到信号则执行                 while (true)
                    {
                    if(canStop)
                    break;
                        Console.WriteLine(i++);
                        Thread.Sleep(1000);
                    }            });            thread.Start();//启动线程  
                }              }
            public static void 结束线程(){
            canStop=true;
            }
      

  5.   


    这个结束线程方法在哪里用呢

    主要是
    canStop=true;
    而不是这个方法。
    你想在那控制线程结束,那就在那指定这个赋值。
      

  6.   

    我想每次进入doAdd方法的时候先关闭之前调用它启用的线程,但是直接写在标红1的地方,标红2肯定就不执行了
      

  7.   


    改变 canStop 为 true 之后,你需要等待/监听你的原来执行的线程把它重新改为 false 之后,才能开始启动你的新的线程。所以 canStop 首先必须是一个方法——属性,而不是一个简单字段。其次它应该触发事件。例如static event Action canStopChanged;
    static bool _canStop = false;static bool canStop
    {
        get { return _canStop; }
        set
        {
            if (value != _canStop)
            {
                _canStop = value;
                if (canStopChanged != null)
                    canStopChanged();
            }
    }这样,你才能够监听canStop改变事件,例如static void test()
    {
        canStopChanged += () => test2();
        canStop = true;
    }static void test2()
    {
        if (!canStop)
        {
            //canStop已经重新设置为 false了,因此可以启动新任务了
        }
    }
      

  8.   

    不要要说明的是,你这里的设计思路其实是一种”死循环+阻塞“的思路。这种代码对于初学者也许最容易”理解“,但是一旦任务负责一点,真正的并发多线程编程的大忌就是这类代码。每一个任务应该瞬间就结束了,是定时任务就用定时器、或者 await Task.Delay 作为控制引擎。真正的并发多线程编程技术,是异步的。
      

  9.   

    弄一堆的”死循环+阻塞语句“来轮询,不会事件驱动方式设计而是使用”线程死循环来模拟事件“,不理解异步,这是初学线程(即使这个人已经工作了10几年,但是可能一直就做一点 winform 或者 asp.net 的 OA小程序)的人的通病。
      

  10.   

    你可以看到,只要你的过程能把 canStop 重新设置为 false,那么一旦上述 test 方法执行过之后,在其它地方任何时候你设置canStop = true;都会很快再次执行 test2 方法。事件驱动设计是一个基本的实现异步流程设计的概念,你用的各种控件、组件都包含大量的事件。不理解事件驱动设计,就等于至少有一半的程序设计知识都没有学过,你之前所有的编程知识都应该结合事件驱动模式来重新学习一遍。这样才能解决你的交互设计中遇到的基本的问题。
      

  11.   

    把那个while(true)里的这个true标志提出来,然后等你点击下一个按钮的时候,把这个标志设为false,然后启动新线程