winForm开发中线程间方法调用需要用委托,比如子线程不能直接调用主线程的方法。

解决方案 »

  1.   

    http://social.msdn.microsoft.com/Search/zh-CN?query=%E5%A7%94%E6%89%98&emptyWater=true&ac=4
      

  2.   

    Google:c#委托的作用Refer:http://www.google.com.hk/webhp?hl=zh-CN&sourceid=cnhp#hl=zh-CN&newwindow=1&q=c%23%E5%A7%94%E6%89%98%E7%9A%84%E4%BD%9C%E7%94%A8&safe=strict
      

  3.   

    大家~我还有一个问题,就是关于事件的处理机制,我看下来,虽然说有委托定义,有调用,但是,没看出来是什么事件触发的。好像就只是定义了然后调用,想问下事件在哪里。代码如下:
    using System;
    public class EventTest
    {
            // 步骤1,定义delegate对象
           public delegate void MyEventHandler(object sender, System.EventArgs e);
           // 步骤2省略
           public class MyEventCls
           {
                    // 步骤3,定义事件处理方法,它与delegate对象具有相同的参数和返回值类// 型
                    public  void MyEventFunc(object sender, System.EventArgs e)
                    {
                                Console.WriteLine("My event is ok!");
                     }
            }
           // 步骤4,用event关键字定义事件对象
          private event MyEventHandler myevent;
          private MyEventCls myecls;
          public EventTest()
          {
                     myecls = new MyEventCls();
                  // 步骤5,用+=操作符将事件添加到队列中
                    this.myevent += new MyEventHandler(myecls.MyEventFunc);
           }
          // 步骤6,以调用delegate的方式写事件触发函数
         protected void OnMyEvent(System.EventArgs e)
          {
                   if(myevent != null)
                            myevent(this, e);
           }
         public void RaiseEvent()
          {
                    EventArgs e = new EventArgs();
                 // 步骤7,触发事件
                    OnMyEvent(e);
           }
          public static void Main()
          {
                    EventTest et = new EventTest();
                    Console.Write("Please input ''a'':");
                   string s = Console.ReadLine();
                   if(s == "a")
                   {
                          et.RaiseEvent();
                    }
                   else
                  {
                             Console.WriteLine("Error");
                   }
           }
    }
      

  4.   

       // 步骤4,用event关键字定义事件对象
          private event MyEventHandler myevent;
       // 步骤5,用+=操作符将事件添加到队列中
                    this.myevent += new MyEventHandler(myecls.MyEventFunc);这就是事件的定义
      

  5.   

    但是,事件的话应该是发生了什么的时候触发的,貌似没看出来发生了什么,好像只是符合了 
    if(myevent != null)
    就触发了。
      

  6.   

    但是,事件的话应该是发生了什么的时候触发的,貌似没看出来发生了什么,好像只是符合了 
    if(myevent != null)
    就触发了。
    想OnClick之类的是在点击后触发,但是在那段代码里,我看不出是在发生了什么之后触发的。求教~
      

  7.   

    但是,事件的话应该是发生了什么的时候触发的,貌似没看出来发生了什么,好像只是符合了 
    if(myevent != null)
    就触发了。
      this.myevent += new MyEventHandler(myecls.MyEventFunc);
    是注册事件
    发生了 就触发事件
    RaiseEvent()
      

  8.   

    但是,事件的话应该是发生了什么的时候触发的,貌似没看出来发生了什么,好像只是符合了 
    if(myevent != null)
    就触发了。
      this.myevent += new MyEventHandler(myecls.MyEventFunc);
    是注册事件
    发生了 就触发事件
    RaiseEvent()
    不知道我这么理解对不对。
    在执行了注册事件的代码
    this.myevent += new MyEventHandler(myecls.MyEventFunc);
    之后,myevent就不等于 null了。
    所以在注册事件后,每次我执行
     protected void OnMyEvent(System.EventArgs e)
          {
                   if(myevent != null)
                            myevent(this, e);
           }
    这个方法的时候,就会执行myevent(this, e);
    也就是说,当我通过+=进行事件注册后,对于myevent(this, e);就相当于和调用方法的操作一样了。所谓的我想要在发生什么事件(如点击)后进行,都是我在调用myevent(this, e);之前自己在代码中做操作。
    也就是说,这个事件处理机制,只是提供了我一个异步操作的可能,剩下的基本和调用公共方法差不多。
    是这样么?
      

  9.   

    但是,事件的话应该是发生了什么的时候触发的,貌似没看出来发生了什么,好像只是符合了 
    if(myevent != null)
    就触发了。
      this.myevent += new MyEventHandler(myecls.MyEventFunc);
    是注册事件
    发生了 就触发事件
    RaiseEvent()
    不知道我这么理解对不对。
    在执行了注册事件的代码
    this.myevent += new MyEventHandler(myecls.MyEventFunc);
    之后,myevent就不等于 null了。
    所以在注册事件后,每次我执行
     protected void OnMyEvent(System.EventArgs e)
          {
                   if(myevent != null)
                            myevent(this, e);
           }
    这个方法的时候,就会执行myevent(this, e);
    也就是说,当我通过+=进行事件注册后,对于myevent(this, e);就相当于和调用方法的操作一样了。所谓的我想要在发生什么事件(如点击)后进行,都是我在调用myevent(this, e);之前自己在代码中做操作。
    也就是说,这个事件处理机制,只是提供了我一个异步操作的可能,剩下的基本和调用公共方法差不多。
    是这样么?
    可以这样理解比如:你某个地方西要用到 就this.myevent += 
    用完记得 this.myevent -=
      

  10.   

    恩恩,我终于懂了~~~感谢大家~~~
    最后问下,用event关键字定义事件对象,但是不用event貌似功能也一样的,那event有什么用?
      

  11.   

    事件是多播委托,这个在C#基础知识书籍中都会提到,根本没必要问。
    声明为事件的好处是,可以在程序各个位置添加相互独立的事件处理函数,不用担心被其它人给覆盖掉。我弄明白了,基础部分完全懂了,event就是多了+=和-=。
      

  12.   

    除了线程间的调用,在其他地方,委托和公共方法都差不多的么?
    如果这样,方法能跨线程了变量可以跨线程么?我以前好像遇到线程间无法调用变量的。变量不存在跨线程一说,只是UI对象要在非UI线程里操作,需要委托给UI线程去处理,而变量在任何线程你都可以随意访问,这时你要做好同步,或者使用线程安全的对象
      

  13.   

    事件是多播委托,这个在C#基础知识书籍中都会提到,根本没必要问。
    声明为事件的好处是,可以在程序各个位置添加相互独立的事件处理函数,不用担心被其它人给覆盖掉。我弄明白了,基础部分完全懂了,event就是多了+=和-=。
    结贴后发现这个是错的,event是用来限制触发条件的。委托也可以绑定多个处理函数。
      

  14.   

    除了线程间的调用,在其他地方,委托和公共方法都差不多的么?
    如果这样,方法能跨线程了变量可以跨线程么?我以前好像遇到线程间无法调用变量的。变量不存在跨线程一说,只是UI对象要在非UI线程里操作,需要委托给UI线程去处理,而变量在任何线程你都可以随意访问,这时你要做好同步,或者使用线程安全的对象
    这样啊,学到一条,(*^__^*) 谢谢~