一、c#中invoke和begininvoke的区别
区别在于Invoke是同步,BeginInvoke是异步。
打个比方(伪代码),后台线程中需要通知UI界面进行刷新
newThread()
{
/*比如读取数据库的方法,比较耗时;
vardata=GetData();读取完成后通知UI线程,
this.Invoke(data);//如果GetData方法是同步方法,则用Invoke回调
//this.BeginInvoke(data);//如果GetData是异步方法,则用BeginInvoke回掉
}
在.NET4.5或者更早的版本中,如果异步方法使用Invoke也是可以编译通过的,同时在Debug的时候也不会有问题,但是发布出去就会出异常。同步方法用BeginInvoke也是如此。
之前项目中出现过一次异步方法用Invoke回调,总是出异常,而且vs调试了很久都不知道问题出在哪里,所以一定要弄清楚后台运行的方式到底是同步还是异步。
二、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);
}
}
}
}
三、C#delegate方法invoke和beginInvoke的区别
class Program
{
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是使用主线程运行其代码的,并没有另起线程。
四、C#中Invoke 和 BeginInvoke 的区别
区别在于Invoke是同步,BeginInvoke是异步。
打个比方(伪代码),后台线程中需要通知UI界面进行刷新
newThread()
{
/*比如读取数据库的方法,比较耗时;
vardata=GetData();读取完成后通知UI线程,
this.Invoke(data);//如果GetData方法是同步方法,则用Invoke回调
//this.BeginInvoke(data);//如果GetData是异步方法,则用BeginInvoke回掉
}
在.NET4.5或者更早的版本中,如果异步方法使用Invoke也是可以编译通过的,同时在Debug的时候也不会有问题,但是发布出去就会出异常。同步方法用BeginInvoke也是如此。
之前项目中出现过一次异步方法用Invoke回调,总是出异常,而且vs调试了很久都不知道问题出在哪里,所以一定要弄清楚后台运行的方式到底是同步还是异步。
OK,本文到此结束,希望对大家有所帮助。