C#中Invoke 和 BeginInvoke 的真正涵义

2019-12-26 12:23:55王振洲

易采站长站为您分析C#中Invoke 和 BeginInvoke 的真正涵义,需要的朋友可以参考下

BeginInvoke 方法真的是新开一个线程进行异步调用吗?

参考以下代码:

 

 
  1. public delegate void treeinvoke();  private void UpdateTreeView() 
  2. {  MessageBox.Show(System.Threading.Thread.CurrentThread.Name); 
  3. }  private void button1_Click(object sender, System.EventArgs e) 
  4. {  System.Threading.Thread.CurrentThread.Name = "UIThread"; 
  5. treeView1.BeginInvoke(new treeinvoke(UpdateTreeView));  } 

看看运行结果,弹出的对话框中显示的是 UIThread,这说明 BeginInvoke 所调用的委托根本就是在 UI 线程中执行的。

既然是在 UI 线程中执行,又何来“异步执行”一说呢?

我们再看看下面的代码:

 

  1. public delegate void treeinvoke();  private void UpdateTreeView() 
  2. {  MessageBox.Show(Thread.CurrentThread.Name); 
  3. }  private void button1_Click(object sender, System.EventArgs e) 
  4. {  Thread.CurrentThread.Name = "UIThread"; 
  5. Thread th = new Thread(new ThreadStart(StartThread));  th.Start(); 
  6. }  private void StartThread() 
  7. {  Thread.CurrentThread.Name = "Work Thread"; 
  8. treeView1.BeginInvoke(new treeinvoke(UpdateTreeView));  } 


再看看运行结果,弹出的对话框中显示的还是 UIThread,这说明什么?这说明 BeginInvoke 方法所调用的委托无论如何都是在 UI 线程中执行的。