最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中Invoke和BeginInvoke區(qū)別小結(jié)

 更新時(shí)間:2023年08月16日 10:15:38   作者:劉歡(C#)  
有時(shí)候,我們不得不跨線程調(diào)用主界面的控件來進(jìn)行操作,所以為了方便的解決問題,.net為我們提供了Invoke?與beginInvoke,那么Invoke和BeginInvoke區(qū)別在哪,本文就來詳細(xì)的介紹一下

本文導(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)文章

最新評(píng)論

喀喇沁旗| 孝义市| 宁强县| 浪卡子县| 哈巴河县| 萨嘎县| 天气| 科尔| 霍林郭勒市| 庄浪县| 黔江区| 宁陕县| 敖汉旗| 清涧县| 淮滨县| 奉贤区| 类乌齐县| 惠州市| 循化| 五常市| 德阳市| 敦煌市| 铜陵市| 长岭县| 时尚| 邢台县| 滁州市| 长沙市| 廉江市| 吉隆县| 阿克陶县| 新巴尔虎左旗| 织金县| 门源| 九台市| 蓬溪县| 龙州县| 大方县| 蒙阴县| 富锦市| 罗山县|