C#委托与跨线程

来源:互联网 发布:淘宝内衣代理货源 编辑:程序博客网 时间:2024/06/03 21:51

一、委托

     1、定义

          C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。

         委托(Delegate)是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

         委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自System.Delegate 类。

     2、声明

          委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。

       声明委托的语法如下:    

delegate <return type> <delegate-name> <parameter list>
     3、实例化

           一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。

         当创建委托时,传递到new 语句的参数就像方法调用一样书写,但是不带有参数。

   4、示例---委托的声明、实例化和使用

using System;  //命名空间delegate int NumberChanger(int n);//委托声明namespace DelegateAppl{   class TestDelegate   {      static int num = 10;      public static int AddNum(int p)      {         num += p;         return num;      }      public static int MultNum(int q)      {         num *= q;         return num;      }      public static int getNum()      {         return num;      }      static void Main(string[] args)      {         // 创建委托实例         NumberChanger nc1 = new NumberChanger(AddNum);         NumberChanger nc2 = new NumberChanger(MultNum);         // 使用委托对象调用方法         nc1(25);         Console.WriteLine("Value of Num: {0}", getNum());         nc2(5);         Console.WriteLine("Value of Num: {0}", getNum());         Console.ReadKey();      }   }}
 执行结果如下:

Value of Num: 35Value of Num: 175

二、InvokeRequired和Invoke


      1、由来

                C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的。

             当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它

             此时它将会在内部调用new MethodInvoker(LoadGlobalImage)来完成下面的步骤,这个做法保证了控件的安全。

             你可以这样理解,有人想找你借钱,他可以直接在你的钱包中拿,这样太不安全。

             因此必须让别人先要告诉你,你再从自己的钱包把钱拿出来借给别人,这样就安全了           

            在设计中为了让界面与逻辑分离,我的做法是使用事件,界面只要响应事件来处理界面的显示就行了。
            而事件在逻辑处理中可能由不同的线程引发,这些事件的响应方法在修改界面中的控件内容时便会引发一个异常。
            这时就用到了Control.InvokeRequired 属性 与Invoke方法。

        2、


三、结合使用


     1、委托声明          

 private delegate void SetText(TextBox tb,string str);

       2、委托实例化         

            private void SetAppendTB(TextBox tb,string str)            {                   if(tb.InvokeRequired)                   {                        SetText setText = new SetText(SetAppendTB);                        Invoke(setText,new object[ ] { tb, str } );                   }                   else                   {                         tb.Text = str;                   }            }

       3、跨线程调用          

SetAppendTB(richTextBox1, str);

 

原创粉丝点击