说法可能有些问题,例如方法 A();A()地执行时间为1分钟.
点下Button调用一次A(),再1分钟内点个十次八次的,就会出现在同一个时间同时有很多个线程在调用A()。我想只在最近的线程里执行A(),而取消其他线程的操作该如何做?在单线程里做,不停的点Button 一直死在那里,过一会儿才可以继续,
下面的代码是单线程里做Thread myThread;        private void button1_Click(object sender, EventArgs e)
        {
            if (myThread != null)
            {
                if ((myThread.ThreadState & (ThreadState.Stopped | ThreadState.Unstarted)) == 0)
                {
                    myThread.Abort();
                    this.listBox1.Items.Add("Cancel one threassssssssssssssssssssssssssssssssssssssssssssssssssssss");
                }
            }
            myThread = new Thread(new ThreadStart(DoSomething));
            myThread.Start();
        }        private delegate void ItemAddHandle(int i);
            
        private void DoSomething()
        {
            listBox1.BeginInvoke(new ItemAddHandle(ShowStartInfo), new object[] { 1 });                         for (int i = 0; i < 10000; i++)
            {                
                listBox1.BeginInvoke(new ItemAddHandle(DoItemAdd), new object[] { i});               
            }
        }
        private void DoItemAdd(int i)
        {
            this.listBox1.Items.Add(i.ToString());
        }
        private void ShowStartInfo(int i)
        {
            this.listBox1.Items.Add("new threaddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd");
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (myThread != null)
            {
                if ((myThread.ThreadState & (ThreadState.Stopped | ThreadState.Unstarted)) == 0)
                {
                    myThread.Abort();
                }
            }
        }

解决方案 »

  1.   

    窗体中多线程可以使用控件自带的异步方法
    例如
    IAsyncResult iAsyncResult = form1.BeginInvoke() ;  开始
    if(!iAsyncResult.IsCompeleted) 结束
    {
    EndInvoke(IAsyncResult );
    }
      

  2.   

    Mutex用.NET 的里面提供的几个线程同步对象.可以解决你的问题.
      

  3.   

    Mutex 互斥体,多线程同步中涌来确保一次只有一个线程使用该资源。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。
    我想要的是如果启动第二个线程,则立刻结束第一个线程,开始第二个线程。
      

  4.   

    private stop = false;
    public void theadProc()
    {
         int i = 0;
         while(!stop)
         {
              Threading.Thread.Sleep(10);
              if(i>50000) break;
         }
         stop = true;
    }
    执行n次,就尝试先设置stop = false,然后等够一次循环,然后启动。
    或者不要释放thread,
    Thread xx = .....;
    下一次就检查以下 if xx is isvalid ....