最新文章 (全部类别)
LinERP - 线联ERP - 表格列头通用弹出菜单
LinERP - 线联ERP - 物料管理
CMS修改主菜单类别编码CategoryNo
LinERP - 线联ERP试用版下载
LinERP - 线联ERP客户服务
LinERP - 线联ERP主界面
LinERP - 线联ERP系统登陆
LinERP - 线联ERP简介
明细表支持批量操作删除
C# 图片按钮特效:鼠标移入变浅,移出恢复原样 (ImageButtonHover类)
C# 复制对象属性 CopyProperties扩展方法
线联ERP - 海康威视人脸考勤机设置固定IP、重启设备操作手册
线联ERP - 用户操作手册 - 系统初始化
线联ERP - 什么是主账套?
线联ERP - 用户操作手册 - 公司资料设置
C/S快速开发框架旗舰版CSFrameworkV6.0 - VS开发环境配置
修复BUG: CSFramework.EF框架 Remove<T>, RemoveWhere<T>
使用Xlight FTP文件服务器
印章公章在线免费制作
CSFrameworkV6.1旗舰版 - appsettings.json 配置文件增加参数
推荐:使用Photoshop制作ico图标
C#.NET格式化显示:数字末尾不显示0
SQL脚本:更新主表的完成标记FlagFinish=Y
FastReport.NET 设计器汉化&运行时汉化
VS2026/VS2022 关闭 “自动添加 using 命名空间”
C#将List<T>导出为 CSV 文件(Excel 直接打开,无需第三方组件包)
.NET8+EF.Core开发的大型ERP系统客户端4GB电脑测试报告
线联ERP - LinERP HR+考勤系统正式上线
CSFrameworkV6旗舰版 - 复制单据功能
QMS软件简介 | 成本核算报价系统软件简介
QMS - 五金制品行业成本核算报价系统 - 货币资料
QMS - 五金制品行业成本核算报价系统 - 公共字典管理
QMS - 五金制品行业成本核算报价系统 - 物料类别
QMS - 五金制品行业成本核算报价系统 - 物料管理
QMS - 五金制品行业成本核算报价系统 - 图纸文件管理
QMS - 五金制品行业成本核算报价系统 - 供应商管理
QMS - 五金制品行业成本核算报价系统 - 车型费管理
QMS - 五金制品行业成本核算报价系统 - 制程段配置
QMS - 五金制品行业成本核算报价系统 - 产品咨询
QMS五金制品行业报价系统 - 用户操作手册 - 成本中心核算
QMS五金制品行业报价系统 - 用户操作手册 - 报价单 - Quotation
QMS五金制品行业报价系统 - 用户操作手册 - 成本汇总表
QMS五金制品行业报价系统 - 用户操作手册 - 采购评估
QMS五金制品行业报价系统 - 用户操作手册 - 成本基础资料表
QMS五金制品行业报价系统 - 用户操作手册 - 新品可行性评估
QMS - 成本核算报价管理系统软件截图
QMS五金制品行业报价系统 - 用户操作手册 - 业务员管理
QMS五金制品行业报价系统 - 用户操作手册 - 客户管理
QMS五金制品行业报价系统 - 用户操作手册 - 工艺工序维护
QMS五金制品行业报价系统 - 用户操作手册 - 设备登记
.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# WebService异步处理/异步调用详解
C#.NET7 线播放mp3/wav音频|winmm.dll winapi播放音乐文件
C#.Net前台线与后台线的区别
尝试释放正在使用的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 AI编程 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数据访问层 DaMeng Database datalock DbFramework DeepSeek Demo教学 Demo实例 Demo下载 DevExpress教程 Docker Desktop DOM ECS服务器 EFCore EF框架 Element-UI EntityFramework ERP ES6 Excel FastReport GIT HR HR考勤系统 IDatabase IIS JavaScript LinERP LINQ MES MiniFramework MIS MSSQL MySql NavBarControl NETCore Node.JS NPM OMS Oracle资料 ORM PaaS POS PostgreSql Promise API PSD QMS 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 安装环境 版本区别 报表 备份还原 踩坑日记 操作手册 成本核算系统 达梦数据库 代码生成器 电子线材ERP 迭代开发记录 功能介绍 官方软件下载 国际化 海康威视考勤 基础资料窗体 架构设计 角色权限 开发sce 开发工具 开发技巧 开发教程 开发框架 开发平台 开发指南 客户案例 快速搭站系统 快速开发平台 框架升级 毛衫行业ERP 秘钥 密钥 企业网络维护 权限设计 软件报价 软件测试报告 软件加壳 软件简介 软件开发框架 软件开发平台 软件开发文档 软件授权 软件授权注册系统 软件体系架构 软件下载 软件著作权登记证书 软著证书 三层架构 设计模式 生成代码 实用小技巧 视频下载 收钱音箱 数据锁 数据同步 塑木地板行业ERP 推荐软件 微信小程序 未解决问题 文档下载 喜鹊ERP 喜鹊软件 系统对接 线联ERP 详细设计说明书 新功能 信创 行政区域数据库 需求分析 疑难杂症 蝇量级框架 蝇量框架 用户管理 用户开发手册 用户控件 在线软件 在线支付 纸箱ERP 智能语音收款机 自定义窗体 自定义组件 自动升级程序
联系我们
联系电话:13923396219(微信同号)
电子邮箱:23404761@qq.com
站长微信二维码
微信二维码