我在一个程序里通过delegate.begininvoke创建了一个线程,用来执行一个新的任务,由于我的委托方法里执行的任务耗时比较长,我想执行的过程中将其中断掉,但主程序不能退出,请问如何能实现?简单代码如下:
 
                public   void   Write1()   
                  {   
                          Thread.Sleep(40000);   
                          MessageBox.Show("方法1");   
                  }   
                  MyMethodDelegate   d1   =   new   MyMethodDelegate(Write1);
                  private   void   button1_Click(object   sender,   EventArgs   e)   
                  {   
                                                     
                          AsyncResult   MyResult1,   MyResult2;   
                          MyResult1   =   (AsyncResult)d1.BeginInvoke(null,   null);   
                           
                              
                  }
                  private void button2_Click(objece sender,EvevtArgs e)
                {
                     //我想在这里实现 上面d1的中断或退出,该如何实现
                 }
谢谢!

解决方案 »

  1.   

    private bool isCancel=false;
                      MyMethodDelegate  d1  =  new  MyMethodDelegate(Write1); 
                      private  void  button1_Click(object  sender,  EventArgs  e)  
                      {  
                                                        
                              AsyncResult  MyResult1,  MyResult2;  
                              MyResult1  =  (AsyncResult)d1.BeginInvoke(null,  null);  
                              while(true)//上面要使用回调方法,把判断调不调用d1.EndInvoke,不然像现在这个界面会死在那
                               { 
                                  if(MyResult1.IsCompleted)
                                    {
                                       d1.EndInvoke(MyResult1);
                                       break;
                                    }
                                   else if(isCancel)
                                    {
                                      //取消操作
                                           break;
                                    }                           }
                                  
                      } 
                      private void button2_Click(objece sender,EvevtArgs e) 
                    { 
                        //我想在这里实现 上面d1的中断或退出,该如何实现 
                    } 
      

  2.   

    public  void  Write1()  
                      {  
                              Thread.Sleep(40000);  
                               if(isCancel)return;
                                MessageBox.Show("方法1");  
                      }   如果要在这里没执行完就取消,请在这个方法里面判断
      

  3.   

    可以用委托信号量来做但是比较麻烦
    推荐舍弃委托BeginInvoke方式改用BackgroundWorker
    BackgroundWorker有属性可以支持运行时取消异步操作的行为
     
     
      

  4.   

    把BackgroundWorker的CancellationPending 设为ture就可以调用CancelAsync()取消异步操作了;
      

  5.   

    我跟楼主情况一样,想用线程来连接数据库,但一旦连接字串不当的时候就会很耗时地等待,直到抛出异常,需要添加一个终止连接数据库的线程按钮,也是用BeginInvoke开始线程的,但一直找不到很好的解决方案,网上见到的控制线程的都用Thread类……
      

  6.   


    真搞不懂,楼主发明一个 delegate.begininvoke,然后就有人把这个delegate附会到control、thread上。这样张冠李戴有什么意义呢?楼主你的 MyMethodDelegate 又是个什么东西能?不知道它是什么,去谈什么 d1.BeginInvoke 谁又有心思去瞎猜呢?
      

  7.   

    还是要强调不要乱起名字。例如ThreadStart是一个delegate,同时ThreadStart也有Invoke和BeginInvoke,但是如果你把它偷换成什么Delegate.Invoke和Delegate.BeginInvoke,就显得外行了。这样,真正了解BegineInvoke的人,还能符合你的问题么?实事求是地提问才比较容易得到答案。
      

  8.   


    楼主的那个是用关键字delegate 声明委托,我是这样的……
      

  9.   

    因为用Thread类声明异步方法,不能带参数,需要参数的话,就最好设计个类来传参数…在其他网上见到的……而我异步方法带参数,所以不想用Thread类
      

  10.   


    不是有带参数的Thread吗?
      

  11.   

                    AsyncCallback endThread = new AsyncCallback(EndThread);
                    IAsyncResult ar = Dl.BeginInvoke(IRSceneName1, endThread, null);
                   return true;
                }
                catch (System.Exception)
                {
                    return false;
                }
            }
            //结束Dl的线程
            private void EndThread(IAsyncResult ar)
            {
              Dl.EndInvoke(ar);
            }
    当线程结束后会自动调用EndThread来结束线程。