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

C# BeginInvoke實(shí)現(xiàn)異步編程方式

 更新時(shí)間:2023年01月24日 14:32:37   作者:Danny_hi  
這篇文章主要介紹了C# BeginInvoke實(shí)現(xiàn)異步編程方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

BeginInvoke實(shí)現(xiàn)異步編程的三種模式:

1.等待模式

在發(fā)起了異步方法以及做了一些其他處理之后,原始線程就中斷并且等異步方法完成之后再繼續(xù);

eg:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace BeginInvokeDemo
{
    public delegate int myDelegate(int num1,int num2);  //聲明委托
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }        private int Cal_Task1(int num1, int num2)   //方法一
        {
            Thread.Sleep(3000); //進(jìn)程延時(shí)3S,延長(zhǎng)執(zhí)行時(shí)間
            return num1 + num2;
        }
        private int Cal_Task2(int num1, int num2)   //方法二
        {
            return num1 + num2;
        }
        private void button_Calculate_Click(object sender, EventArgs e)
        {
            myDelegate objTest = new myDelegate(Cal_Task1); //定義委托變量,引用任務(wù)1
            IAsyncResult iar = objTest.BeginInvoke(3,4,null,null);  //異步調(diào)用
            textBox_Result1.Text = "計(jì)算中...";            textBox_Result2.Text = Cal_Task2(5,6).ToString();   //同時(shí)可以并行其他任務(wù)            int result = objTest.EndInvoke(iar);    //獲取異步執(zhí)行結(jié)果
            //委托類型的EndInvoke()方法:借助IAsyncResult接口對(duì)象,不斷查詢異步調(diào)用是否結(jié)束。
            //該方法知道被異步調(diào)用的方法所有的參數(shù),所以,異步調(diào)用結(jié)束后,取出異步調(diào)用結(jié)果作為返回值
            textBox_Result1.Text = result.ToString();
        }
    }
}

2.輪詢模式

原始線程定期檢查發(fā)起的線程是否完成,如果沒有則可以繼續(xù)做一些其他事情;

eg:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApplication2
{
    delegate int MyDel(int num1,int num2);
    class Program
    {
        static void Main(string[] args)
        {
            MyDel del = new MyDel(Sum);
            IAsyncResult iar = del.BeginInvoke(3,4,null,null);
            Console.WriteLine("After BeginInvoke");            while(!iar.IsCompleted)
            {
                Console.WriteLine("Not Done");                //繼續(xù)處理
                for (long i = 0; i < 10000000; i++)
                    ;                               //空語句
            }
            Console.WriteLine("Done");            int result = del.EndInvoke(iar);
            Console.WriteLine("Result:{0}",result);            Console.ReadLine();
        }        static int Sum(int x,int y)
        {
            Console.WriteLine("         Inside Sum");
            Thread.Sleep(100);            return x + y;
        }
    }
}

3.回調(diào)模式

原始線程一直執(zhí)行,無需等待或檢查發(fā)起的線程是否完成。

在發(fā)起的線程中引用方法完成之后,發(fā)起的線程就會(huì)調(diào)用回調(diào)方法,由回調(diào)方法再調(diào)用EndInvoke之前處理異步方法的結(jié)果。

eg:

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;namespace _02_AsyncCallBackDemo
{
    public partial class FrmCalllBack : Form
    {
        public FrmCalllBack()
        {
            InitializeComponent();            //【3】初始化委托變量
            this.objMyCal = new MyCalculator(ExecuteTask);            //也可以直接使用Lambda表達(dá)式
            //this.objMyCal = (num, ms) =>
            //{
            //    System.Threading.Thread.Sleep(ms);
            //    return num * num;
            //};
        }        //【3】創(chuàng)建委托變量(因?yàn)楫惒胶瘮?shù)和回調(diào)函數(shù)都要用,所以定義成成員變量)
        private MyCalculator objMyCal = null;        //【4】同時(shí)執(zhí)行多個(gè)任務(wù)
        private void btnExec_Click(object sender, EventArgs e)
        {
            //發(fā)布任務(wù)
            for (int i = 1; i < 11; i++)
            {
                //開始異步執(zhí)行
                objMyCal.BeginInvoke(10 * i, 1000 * i, MyCallBack, i);
                //最后一個(gè)參數(shù)i給回調(diào)函數(shù)的字段AsyncState賦值,如果數(shù)據(jù)很多可以定義成類或結(jié)構(gòu)
            }
        }        //【5】回調(diào)函數(shù)
        private void MyCallBack(IAsyncResult result)
        {
            int res = objMyCal.EndInvoke(result);
            //顯示異步調(diào)用結(jié)果:result.AsyncState字段用來封裝回調(diào)函數(shù)自定義參數(shù),object類型
            Console.WriteLine("第{0}個(gè)計(jì)算結(jié)果為:{1}", result.AsyncState.ToString(), res);
        }        //【2】根據(jù)委托定義一個(gè)方法:返回一個(gè)數(shù)的平方
        private int ExecuteTask(int num, int ms)
        {
            System.Threading.Thread.Sleep(ms);
            return num * num;
        }        //【1】聲明委托
        private delegate int MyCalculator(int num, int ms);
    }
    //異步編程的總結(jié):
    //1. 異步編程是建立在委托的基礎(chǔ)上一種編程的方法。
    //2. 異步調(diào)用的每個(gè)方法都是在獨(dú)立的線程中執(zhí)行的。因此,本質(zhì)上就是一種多線程程序,是簡(jiǎn)化的多線程。
    //3. 比較適合在后臺(tái)運(yùn)行較為耗時(shí)的《簡(jiǎn)單任務(wù)》,并且任務(wù)之間要求相互獨(dú)立,任務(wù)中不應(yīng)該有直接訪問可視化控件大代碼。
    //4. 如果后臺(tái)任務(wù)要求必須按照特定順序執(zhí)行,或者訪問共享資源,則異步編程不太適合,應(yīng)選擇多線程開發(fā)技術(shù)。
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • c#的treeview綁定和獲取值的方法

    c#的treeview綁定和獲取值的方法

    這篇文章主要介紹了c#的treeview綁定和獲取值的方法,需要的朋友可以參考下
    2014-04-04
  • 詳解C#如何將枚舉以下拉數(shù)據(jù)源的形式返回給前端

    詳解C#如何將枚舉以下拉數(shù)據(jù)源的形式返回給前端

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)將枚舉以下拉數(shù)據(jù)源的形式返回給前端,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06
  • AOP從靜態(tài)代理到動(dòng)態(tài)代理(Emit實(shí)現(xiàn))詳解

    AOP從靜態(tài)代理到動(dòng)態(tài)代理(Emit實(shí)現(xiàn))詳解

    AOP為Aspect Oriented Programming的縮寫,意思是面向切面編程的技術(shù)。下面這篇文章主要給大家介紹了關(guān)于AOP從靜態(tài)代理到動(dòng)態(tài)代理(Emit實(shí)現(xiàn))的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • C#中timer類的用法總結(jié)

    C#中timer類的用法總結(jié)

    System.Windows.Forms.Timer是應(yīng)用于WinForm中的,它是通過Windows消息機(jī)制實(shí)現(xiàn)的,類似于VB或Delphi中的Timer控件,內(nèi)部使用API SetTimer實(shí)現(xiàn)的。它的主要缺點(diǎn)是計(jì)時(shí)不精確,而且必須有消息循環(huán)
    2013-10-10
  • C#索引器介紹

    C#索引器介紹

    這篇文章主要介紹了C#索引器介紹,索引器是一種特殊的類成員,它能夠讓對(duì)象以類似數(shù)組的方式來存取,使程序看起來更為直觀,更容易編寫,需要的朋友可以參考下
    2014-10-10
  • 關(guān)于c#中單例模式的一些問題

    關(guān)于c#中單例模式的一些問題

    這篇文章主要給大家介紹了關(guān)于c#中單例模式的一些問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • WPF利用RPC調(diào)用其他進(jìn)程的方法詳解

    WPF利用RPC調(diào)用其他進(jìn)程的方法詳解

    這篇文章主要給大家介紹了關(guān)于WPF利用RPC調(diào)用其他進(jìn)程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • C# cmd中修改顯示(顯示進(jìn)度變化效果)的方法

    C# cmd中修改顯示(顯示進(jìn)度變化效果)的方法

    好多人想在運(yùn)行或者調(diào)試含有大量數(shù)據(jù)或者比較慢C#程序的時(shí)候能夠顯示自己的程序完成的程度,這里有一個(gè)方法能發(fā)不斷地修改cmd的同一行,以達(dá)到顯示完成百分比的目的
    2013-04-04
  • VS.net VSS時(shí),編譯報(bào)錯(cuò):未能向文件“.csproj.FileListAbsolute.txt”寫入命令行 對(duì)路徑 的訪問被拒絕。

    VS.net VSS時(shí),編譯報(bào)錯(cuò):未能向文件“.csproj.FileListAbsolute.txt”寫入命令行 對(duì)路

    在VSS上把項(xiàng)目的Bin和Obj目錄刪除,然后重新取出項(xiàng)目,編譯成功。
    2009-06-06
  • c# 二分查找算法

    c# 二分查找算法

    折半搜索,也稱二分查找算法、二分搜索,是一種在有序數(shù)組中查找某一特定元素的搜索算法
    2013-10-10

最新評(píng)論

廊坊市| 自贡市| 孝昌县| 屏南县| 武陟县| 平舆县| 仪征市| 山西省| 灵石县| 马龙县| 额济纳旗| 鹰潭市| 任丘市| 梅州市| 舞钢市| 临泽县| 合肥市| 荔浦县| 大化| 界首市| 六枝特区| 土默特左旗| 白玉县| 侯马市| 卢龙县| 历史| 元朗区| 禹城市| 兴业县| 临澧县| 惠来县| 永泰县| 北川| 开阳县| 永福县| 政和县| 临漳县| 六枝特区| 安图县| 巧家县| 乾安县|