当前位置:网站首页>C#异步和多线程
C#异步和多线程
2022-08-02 20:08:00 【Code Writers】
一、异步
1.创建一个异步
//1-定义一个委托
public delegate int MyCal(int num);
//2-根据委托实现方法
private int ExecuteTask(int num)
{
Thread.Sleep(5000);
return num*num;
}
//3-调用方法
MyCal objCal = ExecuteTask; //引用对应方法
//1.通过委托调用BeginInvoke调用
IAsyncResult Reslut = objCal.BeginInvoke(10,null,null);
//输入和输出变量、回调函数、想通回调的参数object;返回异步操作状态接口类型
//2.获取异步执行结果
int r = objCal.EndInvoke(Reslut); //参数为:异步操作状态接口类型
2.创建多个异步
//1-定义一个委托
public delegate int MyCal(int num,int ms);
//2-根据委托实现方法
private int ExecuteTask(int num,int ms)
{
Thread.Sleep(ms);
return num*num;
}
//3-调用方法
MyCal objCal = ExecuteTask; //引用对应方法
//也可以使用 MyCal objCal = new MyObj(ExecuteTask);
//通过for循环反复调用即可
for(int i=1; i<11; i++)
{
objCal.BeginInvoke(10i,1000i,MyCallBack,i);
}
//4-重写回调函数
private MyCallBack(IAsyncResult reslut)
{
int res = objMyCal.EndInvoke(result);
ConSole.WirteLine(“第”+result.AsyncState.ToString()+“完成结果为”+res);
}
①result.AsyncState的内容就是BeginInvoke中最后一个参数注入的内容。
②重写的回调函数在执行结束时会自动触发。
③BeginInvoke可以循环调用以达成多任务的效果
3.运用Lambda表达式/匿名委托简化
//1-定义一个委托
public delegate int MyCal(int num,int ms);
//2-使用匿名委托+Lambda表达式
this.objMyCal = (num,ms) =>
{
System.Threading.Thread.Sleep(ms);
return num*num;
}
4.异步编程的特点
①建立在委托的基础上
②每个方法在线程中独立运行
③比较适合较为耗时的“简单任务”,要求任务直接相互独立,且不能直接访问可视化控件
④不适合必须按特定顺序执行/访问共享资源,可以选择多线程
二、多线程
1.建议线程
1–建立线程
Thread objT1 = new Thread(Func1); //单参数方法:使用前需要调用的方法<无参委托>
//或使用匿名委托
Thread objT2 = new Tread(delegate()
{
//执行代码
});
2–设置后台线程
objT1.IsBackground = true; //设置为后台线程
3-启动线程
objT1.Start();
2.跨线程访问控件
一般情况下来说,C#不允许跨线程调用控件,可以采用以下方法解决
①禁用跨线程检查
Control.CheckForIllegalCrossThreadCalls = false;
//在Load阶段注入,关闭跨线程检查
②使用Invoke方法
lblResult.Invoke(new Action(s=>{ lblResult.Text = s}),a.ToString());
//参数为无返回委托
3.读取和管理进程
需要引入命名空间:System.Diagnostics;
句柄(Handle):进程的标识符;在关闭进程后需要移除句柄;句柄可以通过Process对象的Handle属性访问(如退出的代码、时间)
①获取本机所用进程
private Process[] allProcess = null; //定义容器
allProcess = Process.GetProcess(); //获取全部进程
②获取进程信息
Process CurrProcess = allProcess[x]; //获取某个进程
ProcessModuleCollection models = CurProcess.Modules; //获取进程调用的模块的信息集
foreach(ProcessModule item in models)
{
lblShow.Text += item.FileName; //展示所有模块信息
}
string info = CurrProcess.Id; //进程的ID
string info = CurrProcess.Handle; //进程句柄
string info = CurrProcess.HandleCount; //进程打开的句柄数
string info = CurrProcess.BasePriority; //进程的优先级
string info = CurrProcess.StartTime; //进程启动优先级
③进程管理
//立即关闭进程
CurProcess.Kill();
CurProcess.Close(); //释放进程资源
//开启一个进程
Process.Start(ProgramName); //参数为文件名(如edge.exe)
Process.Start(“edge.exe”.“www.baidu.com”); //第二个参数为执行的路径
④线程安全
多线程执行中的不确定性可能导致资源的争夺。可以采用加锁的方式对其进行管控
//为线程代码加锁–确保里面的资源仅有当前代码能够调用
lock(this)
{
//执行代码
}
//使用方法属性来实现加锁
using System.Runtime.CompilerService; //引入系统编译服务
//在多线程执行函数外加入属性
[MethodImpl(MethondImplOptions.Synchronized)]
private void ActionMethod() {}
边栏推荐
- SQL 嵌套 N 层太长太难写怎么办?
- 引用类型 ,值类型 ,小坑。
- 【 LeetCode 】 1374. Generate each character string is an odd number
- "A daily practice, happy water problem" 1374. Generate a string with an odd number of each character
- 【实战 已完结】WPF开发自动化生产管理平台
- .NET如何快速比较两个byte数组是否相等
- Bena的生命周期
- 供电系统电气图
- 基于“无依赖绝对定位”实现的圣杯三栏布局
- Likou Question of the Day - Day 46 - 344. Reverse Strings
猜你喜欢

SQL Server安装教程

4 kmiles join YiSheng group, with more strong ability of digital business, accelerate China's cross-border electricity full domain full growth

Translate My Wonderful | July Moli Translation Program Winners Announced

PG's SQL execution plan

谷歌竞价机器学习如何去理解?

iframe------------frame-

供电系统电气图

实现fashion_minst服装图像分类

9,共模抑制比一-不受输入信号中共模波动的影响。【如何分析共模CM抑制比。】

用了TCP协议,就一定不会丢包吗?
随机推荐
OP-5,输入/输出信号范围-一信号处理能力
Day12 接口和协议
SQL Server数据类型转换函数cast()和convert()详解
Async的线程池使用的哪个?
KDD 2022 | 深度图神经网络中的特征过相关:一个新视角
Helm基础知识
4 kmiles join YiSheng group, with more strong ability of digital business, accelerate China's cross-border electricity full domain full growth
Wintun:一款惊艳的 WireGuard 虚拟网卡接口驱动
「每周译Go」这次我们来点不一样的!--《How to Code in Go》系列上线
美国爱荷华州立大学| Improving Distantly Supervised Relation Extraction by Natural Language Inference(通过自然语言推理改进远程监督关系提取)
The five classification of software testing
供电系统电气图
LM小型可编程控制器软件(基于CoDeSys)笔记二十五:plc的数据存储区(数字量输入通道部分)
【手撕AHB-APB Bridge】~ AMBA总线 之 APB
[AnXun cup 2019] easy_web
Electron User Guide Beginning Experience
ShardingSphere-proxy +PostgreSQL implements read-write separation (static strategy)
李沐动手学深度学习V2-BERT预训练和代码实现
如何使用windbg查看C#某个线程的栈大小 ?
setup语法糖 defineProps defineEmits defineExpose