欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

BeginInvoke實現(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); //進程延時3S,延長執(zhí)行時間
            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); //定義委托變量,引用任務1
            IAsyncResult iar = objTest.BeginInvoke(3,4,null,null);  //異步調(diào)用
            textBox_Result1.Text = "計算中...";            textBox_Result2.Text = Cal_Task2(5,6).ToString();   //同時可以并行其他任務            int result = objTest.EndInvoke(iar);    //獲取異步執(zhí)行結果
            //委托類型的EndInvoke()方法:借助IAsyncResult接口對象,不斷查詢異步調(diào)用是否結束。
            //該方法知道被異步調(diào)用的方法所有的參數(shù),所以,異步調(diào)用結束后,取出異步調(diào)用結果作為返回值
            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ā)起的線程就會調(diào)用回調(diào)方法,由回調(diào)方法再調(diào)用EndInvoke之前處理異步方法的結果。

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

總結

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

相關文章

  • 用C#編寫ActiveX控件(二)

    用C#編寫ActiveX控件(二)

    用C#編寫ActiveX控件(二)...
    2007-03-03
  • C#獲取遠程XML文檔的方法

    C#獲取遠程XML文檔的方法

    這篇文章主要介紹了C#獲取遠程XML文檔的方法,涉及C#文件傳輸與XML文檔操作相關技巧,需要的朋友可以參考下
    2016-01-01
  • C#實現(xiàn)彈窗提示輸入密碼

    C#實現(xiàn)彈窗提示輸入密碼

    這篇文章主要為大家詳細介紹了C#實現(xiàn)彈窗提示輸入密碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#中ArrayList?類的使用詳解

    C#中ArrayList?類的使用詳解

    這篇文章主要介紹了C#中ArrayList?類的使用詳解,動態(tài)數(shù)組ArrayList類在System.Collecions的命名空間下,所以使用時要加入System.Collecions命名空間,而且ArrayList提供添加,插入或移除某一范圍元素的方法
    2022-09-09
  • C#中使用閉包與意想不到的坑詳解

    C#中使用閉包與意想不到的坑詳解

    這篇文章主要給大家介紹了關于C#中使用閉包與意想不到的坑,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C#具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-06-06
  • C# 字符串處理小工具

    C# 字符串處理小工具

    本文主要介紹C#字符串處理小工具,實現(xiàn)功能包括:轉換為大寫;轉換為小寫;反轉字符串;匹配某字符串出現(xiàn)次數(shù);正則匹配;base64加密;base64解密;ROT13加密解密;MD5 32位加密。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • C#實現(xiàn)合并多張圖片為GIF動態(tài)圖

    C#實現(xiàn)合并多張圖片為GIF動態(tài)圖

    這篇文章主要為大家詳細介紹了C#如何將把一張又一張的圖片去拼合成一張GIF動態(tài)圖片,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-12-12
  • C# 編譯生成dll文件供程序調(diào)用的兩種方法

    C# 編譯生成dll文件供程序調(diào)用的兩種方法

    這篇文章主要介紹了C# 編譯生成dll文件供程序調(diào)用的兩種方法,需要的朋友可以參考下
    2018-03-03
  • C#集合根據(jù)對象的某個屬性進行去重的代碼示例

    C#集合根據(jù)對象的某個屬性進行去重的代碼示例

    當根據(jù)對象的Name屬性進行去重時,你可以使用以下三種方法:使用Distinct方法和自定義比較器、使用LINQ的GroupBy方法,以及使用HashSet,下面給大家介紹C#集合根據(jù)對象的某個屬性進行去重的代碼示例,感興趣的朋友一起看看吧
    2024-03-03
  • C#實現(xiàn)仿QQ抽屜式窗體的設計方法

    C#實現(xiàn)仿QQ抽屜式窗體的設計方法

    QQ軟件對于絕大多數(shù)的人來說再熟悉不過了,它以使用方便、界面美觀及功能完善而著稱,本文給大家介紹了C#實現(xiàn)仿QQ抽屜式窗體的設計方法,主要通過使用API函數(shù)WindowFromPoint和GetParent實現(xiàn)仿QQ的抽屜式窗體,需要的朋友可以參考下
    2024-04-04

最新評論