当前位置:网站首页>C#异步和多线程
C#异步和多线程
2022-08-08 17: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() {}
边栏推荐
- laravel - query builder 2
- H. Huge Boxes of Animal Toys
- VISTA无人驾驶模拟器;FinRL量化金融深度强化学习库;『深度神经网络应用』电子书;CUDA/TensorRT案例集锦;前沿论文 | ShowMeAI资讯日报
- 开源项目管理解决方案Leantime
- L2-021 点赞狂魔 (25 分)
- B. Stairs
- APICloud AVM wraps date and time selection components
- The difference between B+ tree and B- tree
- 中金证券股票开户流程是什么,我需要准备身份证吗,安全吗
- iNFTnews | Metaverse brings new ideas for enterprise development
猜你喜欢
随机推荐
WPF StepBar
Tensorflow教程(四)——MNIST项目入门
维尔薇vs千劫
Tensorflow教程(二)——基本概念与搭建流程
文件操作和IO
2022年11大最佳缺陷管理工具盘点
R语言4.04安装教程
PNAS最新研究:81%解题率,神经网络 Codex 推开高等数学世界大门
【TypeScript】函数类型:返回值类型和参数类型到底如何定义?
爬百度图片
一、搭建django自动化平台(实现一键执行sql)
Qt——选择文件夹并获取路径以及文件夹下子文件
使用train_test_split划分训练数据集、测试数据集
英特尔两大 FPGA 产品已部署至中国创新中心:性能提高 45%,功耗降低 40%
五、jmeter脚本的基本构成&断言
【20210923】选择感兴趣的研究方向?
C. Palindromifier
智能指针学习笔记
正则在js中的使用
pytorch常用语句