亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

本文導讀:BeginInvoke() 調用時,當前線程會啟用線程池中的某個線程來執(zhí)行此方法,當前線程不被阻塞,繼續(xù)運行后面的代碼, Invoke() 調用時,會阻塞當前線程,等到 Invoke() 方法返回才繼續(xù)執(zhí)行后面的代碼,而這兩個方法中執(zhí)行的是一個委托。

一、c# Invoke和BeginInvoke的認識

1、Invoke() 調用時,Invoke會阻止當前主線程的運行,等到 Invoke() 方法返回才繼續(xù)執(zhí)行后面的代碼,表現(xiàn)出“同步”的概念。

2、BeginInvoke() 調用時,當前線程會啟用線程池中的某個線程來執(zhí)行此方法,BeginInvoke不會阻止當前主線程的運行,而是等當前主線程做完事情之后再執(zhí)行BeginInvoke中的代碼內容,表現(xiàn)出“異步”的概念。

3、EndInvoke() ,在想獲取 BeginInvoke() 執(zhí)行完畢后的結果時,調用此方法來獲取。

二、通過實例說明 c# Invoke和BeginInvoke的區(qū)別

1、實例

 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、實例

  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、實例

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+"中執(zhí)行的");//顯示執(zhí)行該代理函數(shù)的是哪個線程
        }
        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調用showMsg" });//相當于this.Invoke,調用要消耗較長時間的代碼后完了才開始執(zhí)行下一條語句
            MessageBox.Show("Invoke函數(shù)后調用,因為Invoke是同步執(zhí)行的,所以剛才我一直在等待showMsg執(zhí)行完呢,唉...");
        }
        /// <summary>
        /// 線程二的線程函數(shù)
        /// </summary>
        private void threadProc2()
        {
            BeginInvoke(new MsgDelegate(showMsg), new object[] { "通過BeginInvoke調用showMsg" });//相當于this.BeginInvoke()調用要消耗較長時間的代碼后立刻執(zhí)行下一條語句
            MessageBox.Show("BeginInvoke函數(shù)后調用,但由于BeginInvoke的異步執(zhí)行,故還沒等showMsg執(zhí)行完我就被執(zhí)行了!哈哈...");
        }
        private void threadProc()
        {
            MessageBox.Show(Thread.CurrentThread.Name+" 已經(jīng)運行!");
        }
    }
}

到此這篇關于C#中Invoke和BeginInvoke區(qū)別小結的文章就介紹到這了,更多相關C# Invoke和BeginInvoke區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#使用timer實現(xiàn)的簡單鬧鐘程序

    C#使用timer實現(xiàn)的簡單鬧鐘程序

    這篇文章主要介紹了C#使用timer實現(xiàn)的簡單鬧鐘程序,涉及timer控件的使用及音頻文件的操作技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • C#如何優(yōu)雅地取消進程的執(zhí)行之Cancellation詳解

    C#如何優(yōu)雅地取消進程的執(zhí)行之Cancellation詳解

    本文介紹了.NET框架中的取消協(xié)作模型,包括CancellationToken的使用、取消請求的發(fā)送和接收、以及如何處理取消事件
    2024-12-12
  • C#常見應用函數(shù)實例小結

    C#常見應用函數(shù)實例小結

    這篇文章主要介紹了C#常見應用函數(shù),結合實例形式總結分析了C#常用的時間、URL、HTML、反射、小數(shù)運算等相關函數(shù),需要的朋友可以參考下
    2017-01-01
  • C# WPF 通過委托實現(xiàn)多窗口間的傳值的方法

    C# WPF 通過委托實現(xiàn)多窗口間的傳值的方法

    這篇文章主要介紹了C# WPF 通過委托實現(xiàn)多窗口間的傳值的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Unity實現(xiàn)游戲卡牌滾動效果

    Unity實現(xiàn)游戲卡牌滾動效果

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)游戲卡牌滾動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#基于JsonConvert解析Json數(shù)據(jù)的方法實例

    C#基于JsonConvert解析Json數(shù)據(jù)的方法實例

    最近初接觸C#語言,發(fā)現(xiàn)JSON解析這塊和JAVA差異過大,下面這篇文章主要給大家介紹了關于C#基于JsonConvert解析Json數(shù)據(jù)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • C#?RabbitMQ的使用詳解

    C#?RabbitMQ的使用詳解

    本文主要介紹了C#?RabbitMQ的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C#實現(xiàn)中文驗證碼的示例代碼

    C#實現(xiàn)中文驗證碼的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)中文驗證碼功能,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • C# 執(zhí)行CMD命令并接收返回結果的操作方式

    C# 執(zhí)行CMD命令并接收返回結果的操作方式

    這篇文章主要介紹了C# 執(zhí)行CMD命令并接收返回結果的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#實現(xiàn)自動生成電子印章

    C#實現(xiàn)自動生成電子印章

    網(wǎng)絡辦公正逐漸成為常態(tài),無紙化辦公也是一個潮流。本文將利用C#語言實現(xiàn)自動生成電子印章功能,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-08-08

最新評論