调用与begininvoke怎么在c#项目中使用

  介绍

这篇文章给大家介绍调用与begininvoke怎么在c#项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

首先说下,调用和begininvoke的使用有两种情况:

,1. 控制中的调用、begininvoke。

,2. delegrate中的调用、begininvoke只,

,这两种情况是不同的,我们这里要讲的是第1种。下面我们在来说下。net中对调用和begininvoke的官方定义。

,control.invoke(参数代表)方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。

,, control.begininvoke(参数代表)方法:在创建控件的基础句柄所在线程上异步执行指定委托。

,根据这两个概念我们大致理解调用表是同步,begininvoke表示异步。

如果你的后台线程在更新一个UI控件的状态后不需要等待,而是要继续往下处理,那么你就应该使用begininvoke来进行异步处理。

如果你的后台线程需要操作UI控件,并且需要等到该操作执行完毕才能继续执行,那么你就应该使用调用。

我们来做一个测试。

invoke 例子:

private  void  button1_Click (object ,发送方,EventArgs  e)   {   ,,,,,MessageBox.Show (Thread.CurrentThread.GetHashCode () .ToString () +“AAA");   ,,,,,invokeThread =, new 线程(new  ThreadStart (StartMethod));   ,,,,,invokeThread.Start ();   ,,,,,string  a =, string.Empty;   ,,,,,for  (int 小姐:=,0;,小姐:& lt;, 3;,我+ +),,,//调整循环次数,看的会更清楚   ,,,,,{   ,,,,,,,thread . sleep (1000);   ,,,,,,,a =, a  +,“B";   ,,,,,}   ,,,,,MessageBox.Show (Thread.CurrentThread.GetHashCode () .ToString () + a);   }      ,private  void  StartMethod ()   {   ,,,,,MessageBox.Show (Thread.CurrentThread.GetHashCode () .ToString () +“CCC");   ,,,,,button1.Invoke (new  invokeDelegate invokeMethod ());   ,,,,,MessageBox.Show (Thread.CurrentThread.GetHashCode () .ToString () +“DDD");   }      ,private  void  invokeMethod ()   {   ,,,,,//thread . sleep (3000);   ,,,,,MessageBox.Show (Thread.CurrentThread.GetHashCode () .ToString (), +,“EEE");   }

结论:我们运行后,看下程序的运行顺序,1 aaa→3 ccc和1 bbb→1 eee→3 ddd只

解释:主线程运行1 aaa,然后1 bbb和子线程3 ccc同时执行,然后通过调用来将invokemethod方法提交给主线程,然后子线程等待主线程执行,直到主线程将invokemethod方法执行完成(期间必须等待主线程的任务执行完成,才会去执行调用提交的任务),最后执行子线程3 ddd。

begininvoke 例子:

private  void  button1_Click (object ,发送方,EventArgs  e)   {   ,,,,,MessageBox.Show (Thread.CurrentThread.GetHashCode () .ToString () +“AAA");   ,,,,,invokeThread =, new 线程(new  ThreadStart (StartMethod));   ,,,,,invokeThread.Start ();   ,,,,,string  a =, string.Empty;   ,,,,,for  (int 小姐:=,0;,小姐:& lt;, 3;,我+ +),,,//调整循环次数,看的会更清楚   ,,,,,{   ,,,,,,,thread . sleep (1000);   ,,,,,,,a =, a  +,“B";   ,,,,,}   ,,,,,MessageBox.Show (Thread.CurrentThread.GetHashCode () .ToString () + a);   }      ,private  void  StartMethod ()   {   ,,,,,MessageBox.Show (Thread.CurrentThread.GetHashCode () .ToString () +“CCC");   ,,,,,button1.BeginInvoke (new  invokeDelegate invokeMethod ());   ,,,,,MessageBox.Show (Thread.CurrentThread.GetHashCode () .ToString () +“DDD");   }      ,private  void  beginInvokeMethod ()   ,,,{   ,,,,,//thread . sleep (3000);   ,,,,,MessageBox.Show (Thread.CurrentThread.GetHashCode () .ToString (), +,“EEEEEEEEEEEE");   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

调用与begininvoke怎么在c#项目中使用