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+" 已经运行!");
        }
    }
}

this.Invoke和this.BeginInvoke的区别

private void button1_Click(object sender, EventArgs e) {       this.textBox1.Text = "1"; ...
  • gtosky4u
  • gtosky4u
  • 2014年02月28日 08:55
  • 8127

C# this.Invoke()的作用与用法

转载自:http://lidunyang2008.blog.163.com/blog/static/19067620520132233112342/ C# this.Invoke()的作用与用法...
  • u012370255
  • u012370255
  • 2014年04月16日 16:50
  • 10066

MethodInvoker 委托

MethodInvoker 提供一个简单委托,该委托用于调用含 void 参数列表的方法。在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托(摘自MSDN)  ...
  • qq408146580
  • qq408146580
  • 2013年12月23日 14:58
  • 1675

Winform异步解决窗体耗时操作(Action专门用于无返回值,Func专门用于有返回值)

#region 调用timer控件实时查询开关机时间 private void timer1_Tick(object sender, EventArgs e) { string sql = "...
  • config_man
  • config_man
  • 2014年05月12日 03:03
  • 4080

任运自在:线程(Thread)与委托(Invoke和BeginInvoke)和封装

线程(Thread)与委托(Invoke和BeginInvoke) 这几天专门玩线程与委托,到处查找资料看,渐渐明白了用法、写法和一些注意事项; 描述: 什么是进程呢?当一个程序开始运行时,它就是一个...
  • xianfajushi
  • xianfajushi
  • 2012年05月28日 16:49
  • 15363

Control与Delegate的invoke 与begininvoke

 近日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下。感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义 。(一)Control的In...
  • simonezhlx
  • simonezhlx
  • 2007年07月27日 18:49
  • 3654

c#使用MethodInvoker解决跨线程访问控件

.net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线程访问作检查,Control.CheckForIllegalCrossThreadCalls = false...
  • ghevinn
  • ghevinn
  • 2013年09月26日 19:02
  • 11040

this.invoke

Thread thread = new Thread(new ThreadStart(delegate             {                 for (int i =...
  • server126
  • server126
  • 2011年08月02日 16:07
  • 1300

C# serialPort 串口接收中this.Invoke的使用

转载地址:http://www.ciast.net/post/20160752.html private void DisplayText(object sender, EventArgs e)...
  • hjk216
  • hjk216
  • 2017年05月24日 16:28
  • 1284

理解串行并行、同步异步与invoke、begininvoke和endinvoke的关系

首先这是我自己理解的结果,后面随着学习的深入发现问题的话我会再回来改。 串行和并行给我的感觉更多的是方法上的执行顺序 同步与异步给我更多的感觉是线程中的执行顺序,在这里我之前也遇到了一个误区,认为...
  • u014231459
  • u014231459
  • 2017年02月03日 10:38
  • 1227
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:this.Invoke和this.BeginInvoke的区别
举报原因:
原因补充:

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