当前位置:网站首页>C#异步和多线程
C#异步和多线程
2022-08-03 04:19:00 【ViperL1】
一、异步
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(10*i,1000*i,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<string>(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() {}
边栏推荐
- Oracle EMCC可以独立安装吗?还是必须安装到数据库服务器上?
- 3.张量运算
- C# WPF设备监控软件(经典)-上篇
- Shenzhen Offline Registration|StarRocks on AWS: How to conduct rapid and unified analysis of real-time data warehouses
- SeleniumWebDriver扩展插件开发
- I ported GuiLite to STM32F4 board
- vscode access denied to unins000.exe
- 肖sir___面试就业课程____性能测试
- 钢铁电商行业方案:钢铁工业产品全生命周期管理解决方案
- 瑞鹄转债上市价格预测
猜你喜欢
随机推荐
高等代数_证明_不同特征值的特征向量线性无关
数据库基本概述与SQL概述
中断系统需要解决的问题
vscode hide activity bar
移植RT-Thread编译报错thumb conditional instruction should be in IT block
肖sir__自动化面试题
自组织是管理者和成员的双向奔赴
mysql bool盲注
lc marathon 8.2
SeleniumWebDriver扩展插件开发
v-on指令:为元素绑定事件
记录一些遇见的bug——mapstruct和lombok同时使用时,转换实体类时数据丢失问题
接口和协议
【STM32】入门(四):外部中断-按键通过中断动作
数商云供应链集成系统开发方案:多行业集成平台管理自动化
StarRocks 7 月社区动态
(2022杭电多校五)1010-Bragging Dice (思维)
安装ambari
测开:项目管理模块-项目curd开发
工程制图点的投影练习