最新文章 (全部类别)
.NETCore WebApi阻止接口重复调用(请求并发操作)
VS2022消除编译警告
“SymmetricAlgorithm.Create(string)”已过时:“Cryptographic factory methods accepting an algorithm name are obsolete. Use the parameterless Create factory method on the algorithm type instead
SHA256Managed/SHA512Managed已过时:Derived cryptographic types are obsolete. Use the Create method on the base type instead
MD5CryptoServiceProvider已过时:Derived cryptographic types are obsolete. Use the Create method on the base type instead
C#使用HttpClient获取IP地址位置和网络信息
判断IP是否是外网IP、内网IP
C#使用HttpClient获取公网IP
WebRequest.Create(string)已过时:WebRequest, HttpWebRequest, ServicePoint, and WebClient are obsolete. Use HttpClient instead
C#根据第三方提供的IP查询服务获取公网外网IP地址
html/dom/js/javascript开发记录
调试ASP.NETCore Web站点 - 清理IISExpress缓存数据(js,css)
EFCore+Oracle根据不同的Schema连接数据库
主程序集成CSFramework.EF 数据库框架(.NET7版本)
CSFramework.EF数据库框架简介(.NET8+EFCore)
迁移ECS服务器:导致ORACLE监听服务启动不了解决方案
SQLite数据库
VS2022编译报错:Visual Studio 容器工具需要 Docker Desktop
.NET 9 预览版+C#13新功能
EFCore禁用实体跟踪
WebApi开发框架V3.0 (.NETCore+EFCore) 增加AppSettings全局参数类
C#获取应用程序所有依赖的程序集
LINQ Expression 多条件复合条件组合(And/Or)
CSFrameworkV6客户案例 - MHR - 宁德时代制造人力资源系统
CS软件授权注册系统V3 - 发布证书
C/S软件授权注册系统V3.0(Winform+WebApi+.NET8+EFCore版本)
CS软件授权注册系统V3 - 购买方式
CS软件授权注册系统V3 - 试用版下载
CS软件授权注册系统-客户登记(制作证书)
C/S软件授权注册系统V3.0 - 管理员工具
CSFrameworkV6旗舰版开发框架 - 集成软件授权认证系统
CSFramework.Authentication 软件证书管理系统 - 制作软件客户授权证书
CSFramework.Authentication 软件证书管理系统 - MAC地址管理
CSFramework.Authentication 软件授权证书管理系统
Login/Logout接口调用dalUser的Login/Logout方法
C# Newtonsoft.Json.Linq.JObject 转对象
CSFramework.Authentication 软件授权认证系统 - 软件测试报告
C/S架构软件开发平台 - 旗舰版V6.0 - 底层框架迭代开发
C/S架构软件开发平台 - 旗舰版V6.1新功能 - 增加软件授权认证模块
C/S架构软件开发平台 - 旗舰版CSFrameworkV6 Bug修改记录
CS软件授权注册系统V3 - 开发手册 - 软件集成与用户注册
CS软件授权注册系统-模拟MES/ERP用户注册软件
CS软件授权注册系统-发布/部署WebApi服务器(IIS+.NET8+ASP.NETCore)
CS软件授权注册系统-VS2022调试WebApi接口
.NETCore Console控制台程序使用ILogger日志
CS软件授权注册系统-WebApi服务器介绍
ASP.NETCore集成Swagger添加Authorize按钮Bearer授权
CS软件授权注册系统-WebApi服务器配置
.NETCore WebApi发布到IIS服务器无法打开swagger
.NET8/ .NETCore /ASP.NETCore 部署WebApi到IIS服务器需要安装的运行环境
.net敏捷开发,创造卓越

C#异步编程(多线程)


异步编程

async/await特性异步编程

  • 使用模型:
private await Task<int> YibuAsync(int a)//定义一个异步方法 YibuAsync await关键字指示编译器方法内部可能会存在await表达式
{
    //do something
    int b = await AnotherAsync(a);//如果只是标记了async关键字,但方法内没有await表达式,方法仍将同步执行
    return b;//b实际返回到了Task.Result中
}
Task<int> t = YibuAsync(10);//调用异步方法
//doing something

异步方法:async和await关键字同时存在。

  • 控制流程:
  1. 调用异步方法,调用后立即返回一个Task类型的对象。
  2. 调用异步方法后执行到await表达式后返回
  3. 继续执行调用者后续代码。
  4. 当需要使用异步方法执行结果时,若异步方法任未返回。将生成一个continue委托,当操作完成的时候调用continue委托。这个continue委托将控制权重新返回到”async”方法对应的await唤醒点处。
  • 异步方法返回类型
  1. void 调用并返回,调用异步方法后不再做任何处理
  2. Task
  3. Task<T>
  4. ValueTask<T>
  • await表达式
    await表达式由await关键字和一个空闲对象组成(任务),这个任务可以是Task类型的对象,也可以不是,默认情况下,这个任务在当前线程上异步执行。空闲对象指awaitable类型的实例。awaitable类型指包含GetAwaiter方法的类型,该方法没有参数,返回一个awaiter类型的对象。awaier类型包含以下成员:
    bool IsCompleted{get;}
    void OnCompleted(Action);
    以及一下成员之一:
    void GetResult();
    T GetResult();
  • Task.Run()方法
  1. Task.Run的方法签名及返回类型
    Run(Action action)    返回类型 Task
    Run(Action action,CancellationToken token) 返回类型 Task
    Run(Func<TResult> function)    返回类型 Task<TResult>
    Run(Func<TResult> functiom,CancellationToken token) 返回类型 Task<TResult>
    Run(Func<Task> function)  返回类型 Task
    Run(Func<Task> function,CancellationToken token) 返回类型 Task
    Run(Func<Task<TResult>> function) 返回类型 Task<TResult>
    Run(Func<Task<TResult>> function,CancellationToken token) 返回类型 Task<TResult>   

注:Action委托:无参无返回值;Func委托:无参有返回值。

BackgroundWorker类异步编程模式

使用BackgroundWorker类创建一个后台线程,并和主线程通信。该类主要成员如下:

属性:WorkerReportsProgress //设置后台线程是否把它的进度汇报给主线程。
WorkerSupportsCancellation //设置后台线程是否支持从主线程取消。
IsBusy //检查后台线程是否正在运行。
CancellationPending //检查后台线程是否需要被取消。
方法:RunWorkerAsync() //获取后台线程,并执行DoWork事件处理程序
CancelAsync() //把CancellationPending属性设置为True。DoWork事件处理程序需要检查这个属性来决定是否应该停止该处理。
RePortProgress()
事件:DoWork
ProgressChanged
RunWorkerCompleted
控制流程:实例化BackgroundWorker类,创建后台线程,设置后台线程是否向主线程汇报进度属性(WorkerReportsProgress)、后台线程是否支持从主线程取消属性(WorkerSupportsProgress)。在主线程调用RunWorkerAsync()方法,获取后台线程,并触发DOWork事件,执行Dowork事件处理程序,若要向主线程汇报进度,则DoWork事件处理程序调用ReportProgress()方法,触发ProgressChanged事件,主线程可以用附加到ProgressChanged事件上的处理程序。若要取消后台线程的执行,则在主线程中调用CancelSAsync()方法,该方法不会立即取消后台线程的执行,而是将CancellationPending的属性设置为True,后台线程的DoWork事件处理程序需要定期检查CancellationPending的属性,来判断是否需要退出。

任务并行库异步编程模式

Parallel.For循环与Parallel.Foreach循环:许多时候,在使用这两个结构时,每一次迭代都依赖于前一次迭代的计算或行为,但有时候不是,如果迭代之间彼此独立,并且程序运行在多处理机上,那么若能将不同的的迭代放在不同的处理器上进行的话,将受益匪浅。Parallel.For与Parallel.Foreach结构就是这样做的。

这两个结构的形式是包含输入参数的方法。Parallel.For方法有12个重载,其中最简单的签名如下:
public static ParallelLoopResult.For(int fromInclusive,int toExclusive,Action body);

  1. fromInclusive参数是迭代系列的第一个参数。
  2. ToExclusive参数是比迭代系列最后一个索引号大1的整数。即index<ToExclusive计算的一样。
  • 实例代码
    using System.Threading.Tasks;
    Parallel.For(0,15,i=>Console.WriteLine($"The square of {i} is {i*i}"));
    输出结果为无序的0到15的平方。

另一个并行循环结构是Parallel.Foreach(),该方法有多个重载,其中最简单的如下:
static ParallelLoopResult ForEach<TSource>(IEnumerable<TSource> source,Action<TSource> body)

  1. TSource 是集合中对象的类型。
  2. source 是Tsource对象的集合。
  3. body是要应用到集合中每一个元素上的Lambda表达式。

BeginInvoke与EndEInvoke异步编程模式

委托有两个方法:BeginInvoke与EndInvoke,当委托对象的方法列表中只有一个方法时,可使用这里两个方法使其在一个独立的线程中异步执行。分为三种模式,分别是等待直到完成模式、轮询模式和回掉模式。

先来介绍委托类型中的BeginInvoke与EndInvoke方法

  • BeginInvoke方法
  1. BeiginInvoke方法的参数组成:引用方法需要的参数、callback、state。
  2. BeginInvoke从线程池中获取一个线程,并让引用方法在新线程中开始运行。
  3. BeginInvoke方法返回给调用线程一个实现IAsyncResult接口的对象的引用,这个接口引用包含了在线程池中运行的异步方法的当前状态。
  4. 代码示例:
    IAsyncResult iar = del.BeginInvoke(a,b,null,null);
    a,b是委托方法的参数,del是对应的委托实例。
  • EndInvoke方法
    该方法获取由异步方法调用返回的值,并且释放线程使用的资源:
  1. 它接受一个由BeginInvoke方法返回的IAsyncResult对象的引用作为参数,并找到它关联的线程。
  2. 如果线程池中的线程已经退出,则其清理退出线程的状态并释放其资源,找到引用方法的返回值,并将它作为返回值返回。
  3. 如果当EndInvoke被调用时,线程池中的线程仍在运行,调用线程就会停止并等待其完成。
  4. 代码示例:
    int result = EndInvoke(iar);
    result是异步方法的返回值。
  • 等待直到完成模式
    在发起异步方法并做了一些其他处理后,就中断等待异步方法完成后再继续。
  • 轮询模式
    原始线程发起异步方法的调用,做一些其他的处理,并通过定期检查IAsyncResult的IsCompleted属性判断线程是否完成,如果完成,则调用EndInvoke方法,否则,做一些其他处理,间隔一段时间再检查。
  • 回调模式
    原始线程调用异步线程后不在管了,当异步方法调用结束后,系统在新线程中调用用户自定义的方法来处理结果,并且调用委托的EndInvoke方法。这个用户自定义的方法叫回掉方法。

c/s架构winform开发框架

版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
上一篇:C#.NET CLR垃圾回收机制
下一篇:C#语言学习思维导图,c#思维导图
评论列表

发表评论

评论内容
昵称:
关联文章

C#异步编程线
C#异步操作等待窗体,异步线处理数据通用界面(frmThreadOperating)
C#线异步处理数据通用界面窗体(frmThreadOperating)
C# 线入门 - 开发实例
C#.Net使用线池(ThreadPool)与专用线(Thread)
C#,Asp.Net线断点续传下载
C#线处理个队列的数据(交叉线访问及Invoke方法使用)
C# OOP编程 模拟做早餐探索同步异步机制
C#线使用读写锁ReaderWriterLockSlim同步写入文件
.NET5 HttpClient线并发请求阻塞“发生一个或个错误”解决方案
C#.NET7 线播放mp3/wav音频|winmm.dll winapi播放音乐文件
C#.Net前台线与后台线的区别
C# WebService异步处理/异步调用详解
尝试释放正在使用的RCW,活动线或其他线上正在使用该RCW
异步实现Socket Server&Client
C#串口通信编程
CSFramework.WebApi时钟定时作业异步处理程序(IThreadHandler接口)实现
C#.NET 后端WebApi接口搭建教,WebApi接口开发实例
Form - 生产计划排窗体C#源码
OOP:面向对象编程

热门标签
软件著作权登记证书 .NET .NET Reactor .NET5 .NET6 .NET7 .NET8 .NET9 .NETFramework APP AspNetCore AuthV3 Auth-软件授权注册系统 Axios B/S B/S开发框架 B/S框架 BSFramework Bug Bug记录 C#加密解密 C#源码 C/S CHATGPT CMS系统 CodeGenerator CSFramework.DB CSFramework.EF CSFramework.License CSFrameworkV1学习版 CSFrameworkV2标准版 CSFrameworkV3高级版 CSFrameworkV4企业版 CSFrameworkV5旗舰版 CSFrameworkV6.0 CSFrameworkV6.1 CSFrameworkV6旗舰版 DAL数据访问层 Database datalock DbFramework Demo教学 Demo实例 Demo下载 DevExpress教程 Docker Desktop DOM ECS服务器 EFCore EF框架 Element-UI EntityFramework ERP ES6 Excel FastReport GIT HR IDatabase IIS JavaScript LINQ MES MiniFramework MIS MySql NavBarControl NETCore Node.JS NPM OMS Oracle资料 ORM PaaS POS Promise API PSD RedGet Redis RSA SAP Schema SEO SEO文章 SQL SQLConnector SQLite SqlServer Swagger TMS系统 Token令牌 VS2022 VSCode VS升级 VUE WCF WebApi WebApi NETCore WebApi框架 WEB开发框架 Windows服务 Winform 开发框架 Winform 开发平台 WinFramework Workflow工作流 Workflow流程引擎 XtraReport 安装环境 版本区别 报表 备份还原 踩坑日记 操作手册 达梦数据库 代码生成器 迭代开发记录 功能介绍 国际化 基础资料窗体 架构设计 角色权限 开发sce 开发工具 开发技巧 开发教程 开发框架 开发平台 开发指南 客户案例 快速搭站系统 快速开发平台 框架升级 毛衫行业ERP 秘钥 密钥 权限设计 软件报价 软件测试报告 软件加壳 软件简介 软件开发框架 软件开发平台 软件开发文档 软件授权 软件授权注册系统 软件体系架构 软件下载 软件著作权登记证书 软著证书 三层架构 设计模式 生成代码 实用小技巧 视频下载 收钱音箱 数据锁 数据同步 微信小程序 未解决问题 文档下载 喜鹊ERP 喜鹊软件 系统对接 详细设计说明书 新功能 信创 行政区域数据库 需求分析 疑难杂症 蝇量级框架 蝇量框架 用户管理 用户开发手册 用户控件 在线支付 纸箱ERP 智能语音收款机 自定义窗体 自定义组件 自动升级程序
联系我们
联系电话:13923396219(微信同号)
电子邮箱:23404761@qq.com
站长微信二维码
微信二维码