iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#BeginInvoke实现异步编程方式
  • 845
分享到

C#BeginInvoke实现异步编程方式

C#BeginInvokeC#异步编程C#BeginInvoke异步编程 2023-01-28 06:01:51 845人浏览 安东尼
摘要

目录1.等待模式2.轮询模式3.回调模式总结BeginInvoke实现异步编程的三种模式: 1.等待模式 在发起了异步方法以及做了一些其他处理之后,原始线程就中断并且等异步方法完成

BeginInvoke实现异步编程的三种模式:

1.等待模式

在发起了异步方法以及做了一些其他处理之后,原始线程就中断并且等异步方法完成之后再继续;

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,延长执行时间
            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);  //异步调用
            textBox_Result1.Text = "计算中...";            textBox_Result2.Text = Cal_Task2(5,6).ToString();   //同时可以并行其他任务            int result = objTest.EndInvoke(iar);    //获取异步执行结果
            //委托类型的EndInvoke()方法:借助IAsyncResult接口对象,不断查询异步调用是否结束。
            //该方法知道被异步调用的方法所有的参数,所以,异步调用结束后,取出异步调用结果作为返回值
            textBox_Result1.Text = result.ToString();
        }
    }
}

2.轮询模式

原始线程定期检查发起的线程是否完成,如果没有则可以继续做一些其他事情;

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");                //继续处理
                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.回调模式

原始线程一直执行,无需等待或检查发起的线程是否完成。

在发起的线程中引用方法完成之后,发起的线程就会调用回调方法,由回调方法再调用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】创建委托变量(因为异步函数和回调函数都要用,所以定义成成员变量)
        private MyCalculator objMyCal = null;        //【4】同时执行多个任务
        private void btnExec_Click(object sender, EventArgs e)
        {
            //发布任务
            for (int i = 1; i < 11; i++)
            {
                //开始异步执行
                objMyCal.BeginInvoke(10 * i, 1000 * i, MyCallBack, i);
                //最后一个参数i给回调函数的字段AsyncState赋值,如果数据很多可以定义成类或结构
            }
        }        //【5】回调函数
        private void MyCallBack(IAsyncResult result)
        {
            int res = objMyCal.EndInvoke(result);
            //显示异步调用结果:result.AsyncState字段用来封装回调函数自定义参数,object类型
            Console.WriteLine("第{0}个计算结果为:{1}", result.AsyncState.ToString(), res);
        }        //【2】根据委托定义一个方法:返回一个数的平方
        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. 异步调用的每个方法都是在独立的线程中执行的。因此,本质上就是一种多线程程序,是简化的多线程。
    //3. 比较适合在后台运行较为耗时的《简单任务》,并且任务之间要求相互独立,任务中不应该有直接访问可视化控件大代码。
    //4. 如果后台任务要求必须按照特定顺序执行,或者访问共享资源,则异步编程不太适合,应选择多线程开发技术。
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: C#BeginInvoke实现异步编程方式

本文链接: https://www.lsjlt.com/news/178364.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#BeginInvoke实现异步编程方式
    目录1.等待模式2.轮询模式3.回调模式总结BeginInvoke实现异步编程的三种模式: 1.等待模式 在发起了异步方法以及做了一些其他处理之后,原始线程就中断并且等异步方法完成...
    99+
    2023-01-28
    C# BeginInvoke C#异步编程 C# BeginInvoke异步编程
  • Java 异步编程 (5 种异步实现方式详解)
    同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现 @mikechen 目录 什么是异步?一、线程异步二、Future异步三、CompletableFuture异步四、Spring...
    99+
    2023-09-02
    java jvm 数据库
  • Java 的异步编程 (5 种异步实现方式详解)
    一、线程异步 创建一个异步线程 public class AsyncThread extends Thread{ @Override public void run() { System.out.println("...
    99+
    2023-09-03
    java jvm 开发语言
  • C#异步编程Task的创建方式
    一、简介 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:Task支持线程的取消、完成、失败通知等交互性操作,但是T...
    99+
    2024-04-02
  • C#实现基于任务的异步编程模式
    目录一.延续任务二.同步上下文三.使用多个异步方法1.按顺序调用异步方法2.使用组合器四.转换异步模式五.错误处理1.异步方法的异常处理2.多个异步方法的异常处理3.使用Aggreg...
    99+
    2024-04-02
  • 分布式编程的挑战:Python 异步编程的实现方式
    随着互联网技术的不断发展,分布式系统已经成为了现代软件开发中的一个重要组成部分。分布式系统的核心在于将一个大型问题分解成若干个小问题,再将这些小问题分配到多个计算机节点上去处理。这种方式可以大大提高计算效率和系统的可靠性,但是也带来了一些...
    99+
    2023-10-14
    异步编程 编程算法 分布式
  • JavaScript中实现异步编程模式的方法
    小编给大家分享一下JavaScript中实现异步编程模式的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JavaScript中实现异步编程模式的方法:1、回调函数,这是异步编程最基本的方法;2、事件监听;3、发布或订阅...
    99+
    2023-06-14
  • java异步编程的实现方式有哪些
    这篇文章主要介绍“java异步编程的实现方式有哪些”,在日常操作中,相信很多人在java异步编程的实现方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java异步编程的实现方式有哪些”的疑惑有所帮助!...
    99+
    2023-07-05
  • java异步编程的7种实现方式小结
    目录同步编程一、线程 Thread二、Future三、FutureTask四、异步框架 CompletableFuture五、 SpringBoot 注解 @Async六、Sprin...
    99+
    2023-03-23
    java异步编程 Java异步
  • Python编程框架中异步编程的实现方式是什么?
    在Python编程中,异步编程是一种非常重要的编程方式。它可以让我们编写高效的、可扩展的应用程序,同时又能保持代码的简洁性和可读性。本文将介绍Python中异步编程的实现方式。 Python中的异步编程模型 Python中的异步编程模...
    99+
    2023-06-18
    编程算法 框架 异步编程
  • C#异步编程的三种模式
    使用异步编程,方法调用是在后台运行(通常在线程和任务的帮助下),并且不会阻塞调用线程。异步编程有三种模式:异步模式,基于事件的异步模式和基于任务的异步模式(TAP)。 一.异步模式 ...
    99+
    2024-04-02
  • C#中怎么实现异步网络编程
    这期内容当中小编将会给大家带来有关C#中怎么实现异步网络编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#异步网络编程两大方法一、Asynchronous Sockets的方法Socket类的很多连接...
    99+
    2023-06-17
  • 如何用 C++ 函数实现异步编程?
    摘要: c++++ 中的异步编程允许多任务处理,无需等待耗时操作。使用函数指针创建指向函数的指针。回调函数在异步操作完成时被调用。boost::asio 等库提供异步编程支持。实战案例演...
    99+
    2024-04-27
    c++ 异步编程
  • C#使用async和await实现异步编程
    最近在写程序的时候,经常遇到大量需要异步访问的情况,但是对于async和await到底怎么写,还不是非常明确。 1.普通的程序怎么写? class Program { sta...
    99+
    2024-04-02
  • Python并发编程:同步与异步在Laravel中的实现方式
    随着互联网的快速发展,越来越多的Web应用程序需要同时处理多个客户请求。这就需要使用并发编程来提高应用程序的性能和响应能力。Python是一种非常流行的编程语言,也支持并发编程。本文将介绍Python并发编程中的同步和异步方法,并说明如何...
    99+
    2023-09-16
    并发 同步 laravel
  • Golang中异步编程的实现方法
    Golang中异步编程的实现方法 在Golang中,异步编程是通过goroutine和channel实现的。goroutine是轻量级的线程,可以并发执行任务。而channel是gor...
    99+
    2024-02-29
    golang 异步 实现
  • C#实现异步的常用方式总结
    目录前言.NET异步编程模式C#异步有四种实现方式1、异步方法(Async Method TAP模式)2、任务并行库(TPL, Task Parallel Library&...
    99+
    2023-05-19
    C#实现异步方式 C#实现异步 C# 异步
  • 【异步】Java 的 8 种异步实现方式
    异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:发送短信、邮件。 异步的八种实现方式: 线程异步 Thread/Run...
    99+
    2023-09-08
    java spring 开发语言
  • java异步编程有哪些方式
    本篇内容介绍了“java异步编程有哪些方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么需要异步?操作系统可以看作是个虚拟机(VM),...
    99+
    2023-06-15
  • Rust异步编程方式是什么
    这篇文章主要讲解了“Rust异步编程方式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Rust异步编程方式是什么”吧!调度器是如何工作的调度器,顾名思...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作