- //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); //参数为:异步操作状态接口类型
- //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可以循环调用以达成多任务的效果
- //1-定义一个委托
- public delegate int MyCal(int num,int ms);
-
- //2-使用匿名委托+Lambda表达式
- this.objMyCal = (num,ms) =>
- {
- System.Threading.Thread.Sleep(ms);
- return num*num;
- }
①建立在委托的基础上
②每个方法在线程中独立运行
③比较适合较为耗时的“简单任务”,要求任务直接相互独立,且不能直接访问可视化控件
④不适合必须按特定顺序执行/访问共享资源,可以选择多线程
- 1--建立线程
- Thread objT1 = new Thread(Func1); //单参数方法:使用前需要调用的方法<无参委托>
-
- //或使用匿名委托
- Thread objT2 = new Tread(delegate()
- {
- //执行代码
- });
-
- 2--设置后台线程
- objT1.IsBackground = true; //设置为后台线程
-
- 3-启动线程
- objT1.Start();
一般情况下来说,C#不允许跨线程调用控件,可以采用以下方法解决
- Control.CheckForIllegalCrossThreadCalls = false;
- //在Load阶段注入,关闭跨线程检查
- lblResult.Invoke(new Action<string>(s=>{ lblResult.Text = s}),a.ToString());
- //参数为无返回委托
需要引入命名空间: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() {}