C# MethodInvoker委托的使用

一、MethodInvoker是什么?

  MethodInvoker 表示一个委托,该委托可以执行托管代码中声明为void且不接受任何参数的任何方法。在对控件的 invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。



二、MethodInvoker如何使用

  使用MethodInvoker可以不用声明,将需要异步或同步执行的方法当做参数传递给委托实例化的MethodInvoker对象。

 MethodInvoker a = new MethodInvoker(Func);//Func需要异步执行的方法(Func为声明为void且不接受任何参数的方法)
            a.BeginInvoke(null,null);

  

  当Func方法异步执行完成后,需要对主线程的控件进行操作时代码如下

 MethodInvoker a = new MethodInvoker(Func);
            a.BeginInvoke((i =>
            {
                if (i.IsCompleted)
                {
                    if (Button1.InvokeRequired)
                    {
                        Action toDo = () => Button1.Visible = false;
                        ProWaitPanl.Invoke(toDo);
                    }
                    else
                    {
                        Button1.Visible = false;
                    }
                }
            }), null);

  Button1代表需要进行操作的控件,toDo是操作控件的具体方法。

 

时间: 2024-10-16 13:02:58

C# MethodInvoker委托的使用的相关文章

C#中的委托(一)

一.委托 把方法作为参数传给其他方法: 二.声明委托 在C#中使用一个类时,分两个阶段.首先,需要去定义一个类,然后实例化类的一个对象(只需要静态方法除外). 使用委托也需要经过这2个步骤,首先必须定义要使用的委托,对于委托,定义它就是告诉编译器这种类型的委托表示哪种类型的方法.然后,必须创建该委托的一个或多个实例.编译器在后台将创建表示该委托的一个类.定义委托的语法如下: delegate void IntMethodInvoker(int x); 在这个示例中,定义了一个委托IntMetho

C# WinForm多线程(三)Control.Invoke

下面我们就把在Windows Form软件中使用Invoke时的多线程要注意的问题给大家做一个介绍. 首先,什么样的操作需要考虑使用多线程?总的一条就是,负责与用户交互的线程(以下简称为UI线程)应该保持顺畅,当UI线程调用的API可能引起阻塞时间超过30毫秒时(比如访问CD-ROM等速度超慢的外设.进行远程调用等等)就应该考虑使用多线程.为什么是30毫秒?30毫秒的概念是人眼可以察觉到的一个迟滞,大约等同于电影里的一帧停留的时间,最长不要超过100毫秒. 第二,最方便和简单的多线程是使用线程池

NetworkComms网络程序开发笔记(二): 跨线程更新UI

跨线程更新UI的方法也很多 使用系统自带的 MethodInvoker 委托也不失为一个好方法 举例1 void NetworkComms_ConnectionClosed(Connection conn) { if (this.InvokeRequired) { MethodInvoker del = delegate { NetworkComms_ConnectionClosed(conn); }; this.Invoke(del); return; } textBox1.Text = "&

C#线程间通讯

using System;using System.Text;using System.Windows.Forms;using System.Threading; namespace 线程间通讯{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        //1.创建Invoke函数,大致如下:        

实现Winform 跨线程安全访问UI控件

在多线程操作WinForm窗体上的控件时,出现"线程间操作无效:从不是创建控件XXXX的线程访问它",那是因为默认情况下,在Windows应用程序中,.NET Framework不允许在一个线程中直接操作另一个线程中的控件(因为访问Windows窗体控件本质上不是线程安全的).微软为了线程安全,窗体上的控件只能通过创建控件的线程来操作控件的数据,也就是只能是UI线程来操作窗体上的控件!可看看Control的Invoke和BeginInvoke 要解决这个问题可以用以下方法: 1.关闭线

进入快速委托通道

笨拙的委托语法 C#1中,先写好一连串事件处理程序,然后写new EventHandler. #region 5-1 Button button = new Button(); button.Text = "Click me"; button.Click += new EventHandler(LogPlainEvent);//点击触发 button.KeyPress += new KeyPressEventHandler(LogKeyEvent); button.KeyPress +

细说委托

在正式介绍委托之前,我想下看看生活中委托的例子——生活中,如果我们需要打官司,在法庭上是由律师为我们辩护的,然而律师执行的是当事人的陈词,这时候律师就是一个委托对象,当事人委托律师这个对象去帮自己辩护.这就是我们生活中委托的例子的.然而C#中委托的概念也就好比律师对象(从中可以得出委托是一个类,因为只有类才有对象的概念,从而也体现了C#是面向对象的语言). 介绍完生活中委托是个什么后,现在就看看C#中的委托怎样和生活中的对象联系起来的,C#中的委托相当于C++中的函数指针(如果之前学过C++就知

兵棋系列2----兵棋游戏中地图滑动和委托消息

前几天写了一个六边形阵列的算法,今天周末比较闲,下午没事就做了做兵棋的地图操作,一点一点的做吧,总会做好,毕竟我也经常玩各种棋,对做一个这类型的小游戏非常感兴趣. 首先来解释下,下面要出现代码的操作.如上图,当鼠标指针移动到地图的四个边时,地图会自动左右上下滑动(地图比这个from要大很多,不这么做地图显示不完整了,不要跟我说用滚动条,那个给人感觉不好,这也是兵棋里不会缺少的操作吧),同时下面的消息框会记录鼠标的位置,这个消息框前期为我开发时显示一些测试信息用的,后期应该会把它改成一个功能区(部

线程——委托InvokeRequired和Invoke

C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用new MethodInvoker(LoadGlobalImage)来完成下面的步骤,这个做法保证了控件的安全,你可以这样理解,有人想找你借钱,他可以直接在你的钱包中拿,这样太不安全,因此必须让别人先要告诉你,你再从自己的钱包把钱拿出来借给别人,这样就安全了 ----------------------