ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C Sharp委托、事件、多线程

C Sharp委托、事件、多线程 文章目录委托Delegate事件Event—— 安全的“通知系统”多线程Multithreading—— “同时做多件事”委托Delegate委托是方法的模板可以理解为接口中的方法调用时需要new但是在调用过程中要传入和委托声明一样的方法(参数列表要相同)delegatevoidFooDelegate();delegatestringFooInputDelegate(intnum);voidMain(){FooDelegatefooDelegatenewFooDelegate(Foo1);fooDelegatefooDelegateFoo2;// 如果委托不为空就调用委托方法fooDelegate?.Invoke();FooInputDelegatefooInputDelegatenewFooInputDelegate(Foo2);fooInputDelegate(66).Dump();}voidFoo1(){foo1.Dump();}voidFoo2(){foo2.Dump();}stringFoo2(intnum){return(num1).ToString();}在长耗时的程序中延迟1s输出内容delegatevoidCallback();voidMain(){HeavyJob(CallbackImp);}voidHeavyJob(Callbackcallback){Thread.Sleep(1000);callback?.Invoke();}voidCallbackImp(){HeavyJob.Dump();}委托的选择逻辑delegateboolRuleDelegate(intx,inty);intPock(inta,intb,RuleDelegateruleDelegate){if(ruleDelegate(a,b))returna;elsereturnb;}boolrule1(inta,intb){returntrue;}boolrule2(inta,intb){returnfalse;}voidMain(){Pock(10,20,rule1).Dump();Pock(10,20,rule2).Dump();}事件Event—— 安全的“通知系统”是什么事件是委托的升级版。比如你家门铃事件别人只能按门铃触发事件但不能直接拆掉你的门铃线路保证安全。为什么需要它安全外部代码只能订阅或取消订阅-不能直接清空所有绑定。场景比如游戏中的“玩家死亡时通知所有敌人停止攻击”。怎么用//步骤 1定义一个门铃事件publicclassDoorbell{//声明一个事件基于委托publiceventActionstringOnRing;publicvoidRing(){//出发时间按门铃OnRing?.Invoke(有人按门铃啦);// ?. 防止未订阅时出错}}//步骤 2住户的反应订阅事件publicclassResident{publicvoidReactToRing(stringmsg){Console.WriteLine(住户msg我去开门);}}//步骤 3使用门铃voidMain(){DoorbelldoorbellnewDoorbell();ResidentresidentnewResident();//住户订阅门铃时间doorbell.OnRingresident.ReactToRing;//有人按门铃doorbell.Ring();}住户有人按门铃啦我去开门?.安全检查等价于if(OnRing!null){OnRing.Invoke(...);}Invoke正式“触发事件”多线程Multithreading—— “同时做多件事”是什么假设你在煮饭主线程同时还要切菜子线程。多线程就是让程序能“同时”处理多个任务提升效率。为什么需要它防止主界面卡死比如下载文件时不冻结界面。充分利用CPU多核性能。怎么用//方法 1传统方式Thread—— 手动控制voidMain(){ThreadthreadnewThread((){Console.WriteLine(子线程我在切菜);});thread.Start();Console.WriteLine(主线程我在煮饭);}主线程我在煮饭 子线程我在切菜//方法 2现代方式Task—— 更简单高效voidMain(){Task.Run((){Console.WriteLine(子线程我在烧水);});Console.WriteLine(主线程我在炒菜);}主线程我在炒菜 子线程我在烧水//方法 3异步编程async/await—— 等待不阻塞publicasyncTaskCookDinner(){Console.WriteLine(开始做饭);//异步煮饭不阻塞awaitTask.Run((){Thread.Sleep(2000);//2sConsole.WriteLine(饭煮好了);});Console.WriteLine(开始炒菜);//煮晚饭开始//await CookDinner();//调用}asyncTaskMain(){awaitCookDinner();}开始做饭 饭煮好了 开始炒菜() {}这是一个 Lambda 表达式相当于快速写一个“匿名方法”。()参数列表无参数时留空。箭头符号表示“执行后面的代码”。{}代码块具体要执行的任务。ThreadthreadnewThread((){Console.WriteLine(切菜);});// 直接把任务写在括号里相当于voidCutVegetables(){Console.WriteLine(切菜);}ThreadthreadnewThread(CutVegetables);// 传入方法名委托和事件的区别委托是功能基础事件是加了限制的委托类似public和private的区别。多线程会加快程序速度吗不一定如果任务简单切换线程的开销可能反而更慢。适合处理耗时操作如文件读写。async/await 和 Task 的区别async/await 是基于 Task 的语法糖让异步代码看起来像同步代码更易读。
返回列表