C#中Invoke和BeginInvoke區(qū)別小結(jié)
本文導(dǎo)讀:BeginInvoke() 調(diào)用時(shí),當(dāng)前線程會(huì)啟用線程池中的某個(gè)線程來執(zhí)行此方法,當(dāng)前線程不被阻塞,繼續(xù)運(yùn)行后面的代碼, Invoke() 調(diào)用時(shí),會(huì)阻塞當(dāng)前線程,等到 Invoke() 方法返回才繼續(xù)執(zhí)行后面的代碼,而這兩個(gè)方法中執(zhí)行的是一個(gè)委托。
一、c# Invoke和BeginInvoke的認(rèn)識(shí)
1、Invoke() 調(diào)用時(shí),Invoke會(huì)阻止當(dāng)前主線程的運(yùn)行,等到 Invoke() 方法返回才繼續(xù)執(zhí)行后面的代碼,表現(xiàn)出“同步”的概念。
2、BeginInvoke() 調(diào)用時(shí),當(dāng)前線程會(huì)啟用線程池中的某個(gè)線程來執(zhí)行此方法,BeginInvoke不會(huì)阻止當(dāng)前主線程的運(yùn)行,而是等當(dāng)前主線程做完事情之后再執(zhí)行BeginInvoke中的代碼內(nèi)容,表現(xiàn)出“異步”的概念。
3、EndInvoke() ,在想獲取 BeginInvoke() 執(zhí)行完畢后的結(jié)果時(shí),調(diào)用此方法來獲取。
二、通過實(shí)例說明 c# Invoke和BeginInvoke的區(qū)別
1、實(shí)例
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";
}結(jié)果為:123
2、實(shí)例
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";
}結(jié)果為: 132
3、實(shí)例
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);//聲明一個(gè)代理
public partial class Form1 : Form
{
Thread[] threads = new Thread[10];//如果不使用關(guān)鍵字new出對(duì)象來,則會(huì)報(bào)“未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例?!钡腻e(cuò)誤
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()+"號(hào)"; threads[i] = ts; ts.IsBackground = true; ts.Start(); }
}
private void showMsg(String str)
{
Thread.Sleep(5000);//線程休眠5秒...
MessageBox.Show(str+"是在"+Thread.CurrentThread.Name+"中執(zhí)行的");//顯示執(zhí)行該代理函數(shù)的是哪個(gè)線程
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("執(zhí)行A1代碼段");
Thread T1 = new Thread(threadProc1);
T1.Name = "線程一";
T1.Start();
MessageBox.Show("執(zhí)行B1代碼段");
}
private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show("執(zhí)行A2代碼段");
Thread T2 = new Thread(threadProc2);
T2.Name = "線程二";
T2.Start();
MessageBox.Show("執(zhí)行B2代碼段");
}
/// <summary>
/// 線程一的線程函數(shù)
/// </summary>
private void threadProc1()
{
Invoke(new MsgDelegate(showMsg), new object[] { "通過Invoke調(diào)用showMsg" });//相當(dāng)于this.Invoke,調(diào)用要消耗較長(zhǎng)時(shí)間的代碼后完了才開始執(zhí)行下一條語句
MessageBox.Show("Invoke函數(shù)后調(diào)用,因?yàn)镮nvoke是同步執(zhí)行的,所以剛才我一直在等待showMsg執(zhí)行完呢,唉...");
}
/// <summary>
/// 線程二的線程函數(shù)
/// </summary>
private void threadProc2()
{
BeginInvoke(new MsgDelegate(showMsg), new object[] { "通過BeginInvoke調(diào)用showMsg" });//相當(dāng)于this.BeginInvoke()調(diào)用要消耗較長(zhǎng)時(shí)間的代碼后立刻執(zhí)行下一條語句
MessageBox.Show("BeginInvoke函數(shù)后調(diào)用,但由于BeginInvoke的異步執(zhí)行,故還沒等showMsg執(zhí)行完我就被執(zhí)行了!哈哈...");
}
private void threadProc()
{
MessageBox.Show(Thread.CurrentThread.Name+" 已經(jīng)運(yùn)行!");
}
}
}到此這篇關(guān)于C#中Invoke和BeginInvoke區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)C# Invoke和BeginInvoke區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用timer實(shí)現(xiàn)的簡(jiǎn)單鬧鐘程序
這篇文章主要介紹了C#使用timer實(shí)現(xiàn)的簡(jiǎn)單鬧鐘程序,涉及timer控件的使用及音頻文件的操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
C#如何優(yōu)雅地取消進(jìn)程的執(zhí)行之Cancellation詳解
本文介紹了.NET框架中的取消協(xié)作模型,包括CancellationToken的使用、取消請(qǐng)求的發(fā)送和接收、以及如何處理取消事件2024-12-12
C#常見應(yīng)用函數(shù)實(shí)例小結(jié)
這篇文章主要介紹了C#常見應(yīng)用函數(shù),結(jié)合實(shí)例形式總結(jié)分析了C#常用的時(shí)間、URL、HTML、反射、小數(shù)運(yùn)算等相關(guān)函數(shù),需要的朋友可以參考下2017-01-01
C# WPF 通過委托實(shí)現(xiàn)多窗口間的傳值的方法
這篇文章主要介紹了C# WPF 通過委托實(shí)現(xiàn)多窗口間的傳值的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09
Unity實(shí)現(xiàn)游戲卡牌滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)游戲卡牌滾動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
C#基于JsonConvert解析Json數(shù)據(jù)的方法實(shí)例
最近初接觸C#語言,發(fā)現(xiàn)JSON解析這塊和JAVA差異過大,下面這篇文章主要給大家介紹了關(guān)于C#基于JsonConvert解析Json數(shù)據(jù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
C#實(shí)現(xiàn)中文驗(yàn)證碼的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)中文驗(yàn)證碼功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下2022-12-12
C# 執(zhí)行CMD命令并接收返回結(jié)果的操作方式
這篇文章主要介紹了C# 執(zhí)行CMD命令并接收返回結(jié)果的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04

