首页编程begininvoke Invoke和BeginInvoke的区别

begininvoke Invoke和BeginInvoke的区别

编程之家2023-11-0771次浏览

亲爱的读者们,你是否对begininvoke和Invoke和BeginInvoke的区别的相关问题感到困惑?别担心,今天我将为你解答这些问题,让你对此有更清晰的认识。

begininvoke Invoke和BeginInvoke的区别

c#中invoke和begininvoke的区别

区别在于Invoke是同步,BeginInvoke是异步。

打个比方(伪代码),后台线程中需要通知UI界面进行刷新

newThread()

{

/*比如读取数据库的方法,比较耗时;

vardata=GetData();读取完成后通知UI线程,

begininvoke Invoke和BeginInvoke的区别

this.Invoke(data);//如果GetData方法是同步方法,则用Invoke回调

//this.BeginInvoke(data);//如果GetData是异步方法,则用BeginInvoke回掉

}

在.NET4.5或者更早的版本中,如果异步方法使用Invoke也是可以编译通过的,同时在Debug的时候也不会有问题,但是发布出去就会出异常。同步方法用BeginInvoke也是如此。

之前项目中出现过一次异步方法用Invoke回调,总是出异常,而且vs调试了很久都不知道问题出在哪里,所以一定要弄清楚后台运行的方式到底是同步还是异步。

C#delegate方法invoke和beginInvoke的区别

class Program

{

begininvoke Invoke和BeginInvoke的区别

delegate void test();

static void Main(string[] args)

{

test ts= new test(TestDelegate);

ts.BeginInvoke(null,null);//使用到委托的beginInvoke方法

Console.WriteLine("hello");

}

internal static void TestDelegate()

{

Thread.Sleep(5000);

}

}

上面程序代码中使用到begininvoke方法,此时控制台会立刻输出hello字符,然后结束主程序运行。由此可知beginInvoke是在主线程之外,另起了一个线程来运行其所需的代码。

再看下面这点程序

class Program

{

delegate void test();

static void Main(string[] args)

{

test ts= new test(TestDelegate);

ts.Invoke();//使用到委托的invoke方法

Console.WriteLine("hello");

}

internal static void TestDelegate()

{

Thread.Sleep(5000);

}

}

唯一区别就是使用到了 invoke方法,此时控制台会等待5秒,然后才输出hello字符。由此可知invoke是使用主线程运行其代码的,并没有另起线程。

Invoke和BeginInvoke的区别

查看MSDN如下:

Control..::.Invoke--->在拥有此控件的基础窗口句柄的线程上执行委托。

Control..::.BeginInvoke--->在创建控件的基础句柄所在线程上异步执行委托。

显然,Invoke()与 BeginInvoke()方法间的主要区别在于“异步”关键字眼。

也就是说,

Invoke()调用时,会阻塞当前线程,等到 Invoke()方法返回才继续执行后面的代码,表现出“同步”的概念。

BeginInvoke()调用时,当前线程会启用线程池中的某个线程来执行此方法,当前线程不被阻塞,继续运行后面的代码,表现出“异步”的概念。

EndInvoke(),在想获取 BeginInvoke()执行完毕后的结果时,调用此方法来获取。

控件为何会需要Invoke()或BeginInvoke()方法呢?

因为控件的这样一个特点:控件的数据(或状态)值只能在创建控件的那个线程上被更改。也就是说如果控件是在线程A上创建的,则其它任何线程B都不允许修改控件的值,只可以访问(读取)。控件的值只能在线程A上进行更改。

基于以上原因,而又有这样的需求:控件在线程A上创建,又要在线程B中更改其值。所以,Invoke()/BeginInvoke()就出现了。使线程B可以间接地更改在线程A中创建的控件的值。真正更改控件值的操作仍然是在线程A的上下文中执行。

c#中invoke 和 begininvoke 都什么时候用

这两个方法最常用的场合是:多线程环境下更新控件。

例如,在WinForm程序中有一个后线程不断生成新的数字,而程序需要将这个数字在label1控件上显示,这是就需要调用Label控件的nvoke或者BeginInvok方法。

usingSystem;

usingSystem.Drawing;

usingSystem.Windows.Forms;

namespaceWindowsFormsApplication1

{

publicpartialclassForm1:Form

{

//委托

delegatevoidMyDelegate(intx);

publicForm1()

{

InitializeComponent();

//启动一个后台线程

System.Threading.Threadt=

newSystem.Threading.Thread(MyThread);

t.IsBackground=true;

t.Start();

}

voidMyMethod(intx)

{

label1.Text=x.ToString();

}

voidMyThread()

{

intx=0;

//实例化委托

MyDelegatemd=MyMethod;

//线程循环

while(true)

{

x++;

//利用Invok,调用委托md,在label1上显示x的值

label1.Invoke(md,x);

//也可以调用BeginInvok

//label1.BeginInvoke(md,x);

//休眠1秒钟

System.Threading.Thread.Sleep(1000);

}

}

}

}

关于begininvoke,Invoke和BeginInvoke的区别的介绍到此结束,希望对大家有所帮助。

我爱编程 我爱你编程代码是什么border-style?border-style属性有几种(分别是)可否编一小段