this.Invoke和this.BeginInvoke的区别

转载 2016年06月01日 09:39:24

c# Invoke和BeginInvoke 区别

更多2014/12/17 来源:C#学习浏览量:3583
学习标签: 多线程
本文导读:BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,当前线程不被阻塞,继续运行后面的代码, Invoke() 调用时,会阻塞当前线程,等到 Invoke() 方法返回才继续执行后面的代码,而这两个方法中执行的是一个委托。

一、c# Invoke和BeginInvoke的认识

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


3、BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,BeginInvoke不会阻止当前主线程的运行,而是等当前主线程做完事情之后再执行BeginInvoke中的代码内容,表现出“异步”的概念。


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

 

二、通过实例说明 c# Invoke和BeginInvoke的区别

 

1、实例
 
 
C# 代码   复制

private void button1_Click(object sender, EventArgs e)     
{
      this.textBox1.Text = "1";
this.Invoke(new EventHandler(delegate       {
this.textBox1.Text += "2";
         }));
this.textBox1.Text += "3";
      }

结果为:123

 

 2、实例
 
 
C# 代码   复制

private void button1_Click(object sender, EventArgs e)     
{
      this.textBox1.Text = "1";
this.BeginInvoke(new EventHandler(delegate       {
this.textBox1.Text += "2";
         }));
this.textBox1.Text += "3";
      }

结果为: 132

 

 3、实例
 
 
C# 代码   复制

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace InvokeTest
{
delegate void MsgDelegate(String str);//声明一个代理

public partial class Form1 : Form
{
        Thread[] threads = new Thread[10];//如果不使用关键字new出对象来,则会报“未将对象引用设置到对象的实例。”的错误
        public Form1()
{
            InitializeComponent();
        }
private void Form1_Load(object sender, EventArgs e)
{
            Thread.CurrentThread.Name = "主线程";
for(int i=0;i<10;i++)
{
                Thread ts = new Thread(new ThreadStart(threadProc));
                ts.Name = "线程组成员"+i.ToString()+"";
                threads[i] = ts;
                ts.IsBackground = true;
                ts.Start();
            }
        }
private void showMsg(String str)
{
            Thread.Sleep(5000);//线程休眠5秒...
            MessageBox.Show(str+"是在"+Thread.CurrentThread.Name+"中执行的");//显示执行该代理函数的是哪个线程
        }
private void button1_Click(object sender, EventArgs e)
{
            MessageBox.Show("执行A1代码段");
            Thread T1 = new Thread(threadProc1);
            T1.Name = "线程一";
            T1.Start();
            MessageBox.Show("执行B1代码段");
        }
private void button2_Click(object sender, EventArgs e)
{
            MessageBox.Show("执行A2代码段");
            Thread T2 = new Thread(threadProc2);
            T2.Name = "线程二";
            T2.Start();
            MessageBox.Show("执行B2代码段");
        }
/// <summary>
/// 线程一的线程函数
/// </summary>
        private void threadProc1()
{
            Invoke(new MsgDelegate(showMsg), new object[] { "通过Invoke调用showMsg" });//相当于this.Invoke,调用要消耗较长时间的代码后完了才开始执行下一条语句
            MessageBox.Show("Invoke函数后调用,因为Invoke是同步执行的,所以刚才我一直在等待showMsg执行完呢,唉...");
        }
/// <summary>
/// 线程二的线程函数
/// </summary>
        private void threadProc2()
{
            BeginInvoke(new MsgDelegate(showMsg), new object[] { "通过BeginInvoke调用showMsg" });//相当于this.BeginInvoke()调用要消耗较长时间的代码后立刻执行下一条语句
            MessageBox.Show("BeginInvoke函数后调用,但由于BeginInvoke的异步执行,故还没等showMsg执行完我就被执行了!哈哈...");
        }
private void threadProc()
{
            MessageBox.Show(Thread.CurrentThread.Name+" 已经运行!");
        }
    }
}

C#BeginInvoke_和Invoke区别

  • 2011年12月07日 17:58
  • 103KB
  • 下载

Invoke 与BeginInvoke的区别

  • 2016年01月25日 18:52
  • 146KB
  • 下载

C#中Invoke 和 BeginInvoke 的区别(多线程调用Winform)

今天师弟问我SuperGridControl的线程安全问题,我查了一下资料,不知道下面方法是否能解决,但是感觉这个函数很不错,记下来以后试试。 原文连接 相关资料:Invoke 和 B...

c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别

如果只是直接使用子线程访问UI控件,直接看内容三,如果想深入了解从内容一看起。   一、Control.Invoke和BeginInvoke方法的区别 先上总结: Contro...

C#中Invoke 和 BeginInvoke 的区别

原文连接 相关资料:Invoke 和 BeginInvoke 的真正涵义 、在多线程中如何调用Winform Control.Invoke 方法 (Delegate) :在...

Invoke 和 BeginInvoke 的区别

在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate。 一、为什么Control类提供了Invoke和BeginInvoke机制?关于这个问题的最主要的原因已经是dot...
  • fxqcn
  • fxqcn
  • 2011年07月24日 22:19
  • 431

【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)

今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间的区别。所以花了点时间研究了下。   据msdn中介绍,它们最大的区别就是BeginInvoke属于异步执行的。 ...

c# Invoke和BeginInvoke 区别

转自http://www.cnblogs.com/c2303191/articles/826571.htmlControl.Invoke 方法 (Delegate):在拥有此控件的基础窗口句柄的线程上...

文章标题invoke和begininvoke 区别

invoke和begininvoke 区别一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解。首先说下,invoke和begin...
  • Sayesan
  • Sayesan
  • 2017年11月29日 14:12
  • 10

Invoke() 和BeginInvoke()区别

namespace ThreadDemo { public partial class Form2 : Form { private Thread beginI...
  • jglie
  • jglie
  • 2012年05月09日 11:43
  • 817
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:this.Invoke和this.BeginInvoke的区别
举报原因:
原因补充:

(最多只允许输入30个字)