C# 异步编程

news2024/11/17 14:33:12

一 异步编程

1 异步 asynchronize

2 主要解决的事情是

① 等待一些耗时的任务(特别是文件,网络操作)而不阻塞当前任务;
② 异步编程提高响应能力(特别是UI)
开始一个任务后,让任务在离感应线程中执行,本线程可以继续执行别的事情,然后等待那个任务执行完毕。

二 传统的方法1

1 使用委托BeginInvoke及EndInvoke

2 如下:

① PrintDelegate printDelegate=Print;
② IAsncResult result=printDelegate.BeginInvoke(“Hello World”,null,null);
③ Console.WriteLine(“主线程继续执行”);
④ 当使用BeginInvoke异步调用方法时,如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕;
⑤ int n=printDelegate.EndInvoke(result);

三 传统的方法2

1 使用回调

如:
① Console.WriteLine(“主线程”);
② PrintDelegate printDelegate=Print;
③ printDelegate.BeginInvoke(“Hello World.”,PrintComeplete,printDelegate);
④ Console.WriteLine("主线程继续执行…);
⑤ 回调方法要求 返回类型为void 只有一个参数IAsyncResult
public static void PrintCompelete(IAsyncResult result)
{
(result.AsyncState as PrintDelegate).EndInvoke(result);
Console.WriteLine(“当前线程结束。”+result.AsyncState.ToString());
}

四 C# 5.0的新方法

C# 5.0(.Net framework4.5 Visula Studio 2013)
新增await及async两个关键词
await表示等待任务的执行
async修饰一个方法,表示其中有await语句;

1 一般的写法

Task<double>FacAsync(int n)
{
	return Task<doouble>.Run(()=>//Task表示要执行任务
	{
		double s=1;
		for(int i=1;i<n;i++)
		s=s*i;
		return s;
	});
}

async void Test()
{
	double result=await FacAsync(10);//调用异步方法
	Console.WriteLine(result);//异步方法执行完后才执行此句
}

double result=await FacAsync(10);//此处会开心线程处理然后方法马上返回
//这之后的所有代码都会被封装成委托,在任务完成时调用
Console.WriteLine(result);

它解决了传统方法中“异步任务与回调方法分开写”的问题
相当于

System.Runtime.CompilerServices.TaskAwaiter<double>awaiter
=FacAsync(10).GetAwaiter();
awaiter.OnCompleted(()=>
{
	double result=awaiter.GetResult();
	Console.WriteLine(result);
});

在WinForm中 当异常执行完成后,使用解码线程来执行回调,所以写起来更简洁

async Task<string>AccessTheWebAsync(string url)
{
	HttpClient client=new HttpClient();
	Task<string>task=client.GetStringAsync(url);//异步
	DoIndependentWork();//做其他事
	string urlContents=await task;//等待异步执行完毕
	return urlContents;
}

async private void button1_Click(object sender,EventArgs e)
{
	string content=await AccessTheWebAsync(url);
	this.textBox2.Text=content;//编译器让这句在界面线程上执行
}

await后面的语句,就不用麻烦写成Invoke(委托);
在这里插入图片描述

五 异步的流

与上面的HttpClient相似,Stream等类也提供了异步方法

await myStream.WriteAsync(…);
这比传统的BeginWrite()+回调函数+EndWrite()要方便很多;
也可以这样:

Task task=myStream.WriteAsync();//异步
DoIndependentWork();//做其他事
await task;//等待异步执行完毕
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Linq;
using System.IO;
using System.Threading;
using System.Data;
using System.Drawing;

namespace 使用Stream的异步方法
{
    internal class AsyncStream
    {
        async Task<int>WriteFile()
        {
            using (StreamWriter sw = new StreamWriter(
                new FileStream("aaa.txt", FileMode.Create)))
            {
                await sw.WriteAsync("my text");
                return 1;
            }
        }

        async static void Test()
        {
            AsyncStream a =new AsyncStream();

            await a.WriteFile();
            Console.WriteLine("Write OK");
        }
        static void Main(string[] args)
        {
            Test();
            Console.ReadKey();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习:图文详细总结马尔科夫链及其性质(附例题分析)

目录0 写在前面1 从一个实例出发2 马尔科夫链3 马氏链的基本性质4 C-K方程5 平稳状态分布6 遍历性与例题分析0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器…

canopen4.0-canfestiva移植以及同步帧发送

1.canfestival移植入 工程包: 一、canfestival系列教程之程序移植 1.1、首先准备一个hal工程 ,cubmx --------------RCC配置 -----------SYS配置 ----------时钟配置 -----canopen定时器配置(开启中断) --------------can配置波特率,接收中断

CSS3知识点精学

CSS3 被拆分为"模块"。旧规范已拆分成小块&#xff0c;还增加了新的。 一些最重要 CSS3 模块如下&#xff1a; 选择器盒模型背景和边框文字特效2D/3D转换动画多列布局用户界面css引入方式 内嵌式&#xff1a;CSS写在style标签中&#xff0c;style标签虽然可以写在…

PE格式的base reloc分区

https://0xrick.github.io/win-internals/pe7/ 程序雕塑被编译之后&#xff0c;编译器假设可执行文件将会在特定1的v z基地址被加载&#xff0c;这个地址被保存在image_optional_header的imagebase成员中&#xff0c;一些地址会被计算出来然后硬编码到可执行文件中 出于各种原…

malmquist指数案例分析

传统的DEA模型可以反应静态的投入产出效率情况&#xff0c;但如果是面板数据&#xff0c;则需要使用malmquist指数进行研究。malmquist指数可以分析从t期到t1期的效率变化情况。Malmquist指数可分解为技术效率&#xff08;EC&#xff09;和技术进步&#xff08;TC&#xff09;&…

Java高手速成│Java程序怎样和数据库对话

从上一篇 Java高手速成│编写你第一个数据库程序 的例子中可以看出&#xff0c;Java和数据库的连接和对话离不开JDK库类&#xff0c;如java.sql包中支持数据库编程的各种API类、数据库软件DBMS、JDBC驱动软件或Java Connector以及你编写的数据库编程代码。 并且&#xff0c;在…

基础不牢,地动山摇系列 ------ 软硬通吃 unity常用API

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏 unity 实战系列 ⭐相关文章⭐ ——————————————————— -关于游戏剧情模式中用到的基础简单A…

第01讲:Git安装及基本操作

一、什么是Git 版本控制系统&#xff08;VCS&#xff09;是将『什么时候、谁、对什么文件做了怎样的修改』这样的信息以版本的形式保存并进行管理的系统。 简单来说&#xff0c;版本控制系统会去记录它所管理的文件的『历史版本』。 版本控制系统 “不是网盘&#xff0c;而胜…

linux常用命令(一)-路径切换及查看

切换路径-cd 我们可以使用cd&#xff08;change directory&#xff0c;切换目录&#xff09;的命令来进行目录切换 常规 其命令格式为 cd [相对路径或绝对路径] 例如&#xff1a; // 使用相对路径&#xff0c;切换到postfix目录下 cd ../postfix// 使用绝对路径切换到/var/…

Linux操作系统实验1——地址转换

实验要求&#xff1a; 1.在内核中先申请一个页面&#xff0c;使用内核提供的函数&#xff0c;按照寻页的步骤一步步的找到物理地址。这些步骤就相当于我们手动的模拟了mmu的寻页过程。(paging_lowmem.c) 2.通过mmap将物理内存的数据映射到一个设备文件中。 通过访问该设备就可以…

美图商业化2.0:探寻多元增长曲线

【潮汐商业评论/原创】 数字化智能化浪潮正席卷而来。与此前的工业革命、信息技术革命一样&#xff0c;这场箭在弦上的“数智化革命”核心也在于技术的突破与应用。 今年以来&#xff0c;AIGC作为AI技术在内容生产领域的应用&#xff0c;迎来了全球大厂的争相布局&#xff0c…

tensorflow2.x多层感知机模型参数量和计算量的统计

当创建了一个多层感知机模型后&#xff0c;如何调用接口获取该模型的参数量和计算量&#xff1f;首先&#xff0c;打印出模型结构&#xff0c;可通过graphviz模块实现 # 加载模型 model keras.models.load_model(modelPath) tf.keras.utils.plot_model(model, to_filemodel.p…

linux ubuntu 如何自动定时备份数据库到服务器 mysql mysqldump cron

linux ubuntu 如何自动定时备份数据库到服务器 mysql mysqldump cron 一、需求描述 我有一个小日记应用&#xff0c;从 2019 年到 2022 年已经出现了两次比较严重的数据丢失的情况&#xff0c;一次是服务器错误&#xff0c;一次是人为。 所以我急切需要它能自己自动备份数据库…

基于servlet+jsp+mysql实现的java web校园车辆管理系统

一、项目简介 本项目是一套基于servletjspmysql实现的java web校园车辆管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严…

WebDAV之葫芦儿·派盘+Orgzly

Orgzly 支持WebDAV方式连接葫芦儿派盘。 给大家推荐一款Android 上的笔记与 todo 待办事项相融合的应用,它通过树形结构来记录笔记,并且只需要对笔记进行 TODO 标记就能变身任务管理,十分方便。 Orgzly是一款多功能的应用,更确切地说,它是一款 org 文件编辑器。Org 和 …

ArcGIS基础实验操作100例--实验12以线要素分割面要素(二)

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验12 以线要素分割面要素&#xff08;二&#xff09; 目录 一、实验背景 二、实验数据 …

C++ | 缺省参数

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

UDS - 10.2 DiagnosticSessionControl (10) service

来自&#xff1a;ISO 14229-1-2020.pdf 10.2.1 服务描述 DiagnosticSessionControl服务用于在服务器中启用不同的诊断会话。 诊断会话启用服务器中的一组特定诊断服务和/或功能。该服务提供了服务器可以报告数据链路层特定参数值的能力&#xff0c;这些参数值对于已启用的诊断…

Python语言快速入门下1

目录 一、函数 【函数定义与调用】 【形参与实参】 【return语句】 【变量作用域】 【可变长度参数】 二、lambda表达式 三、案例 【例题1】 【例题2】 【例题3】 【例题4】 【例题5】 一、函数 【函数定义与调用】 【例子】一个穷小子想娶富家之女&#xff0c;她…

【正点原子FPGA连载】第四章开发环境搭建摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第四章开发环境搭…