委托(4)

来源:互联网 发布:我的淘宝网 编辑:程序博客网 时间:2024/06/05 18:22

并行委托

并行委托有Parallel.For()、Parallel.Foreach<>()、Parallel.Invoke()三种写法,应用并行可以缩短程序运行时间。
Parallel.For()写法:

static void Main(string[] args){    Stopwatch watch = new Stopwatch();    watch.Start();    //【写法一】    //Parallel.For(1, 11, new DelegateHelper().Test);    //【写法二】    Parallel.For(1, 11, delegate(int i) {         Console.WriteLine(i); Thread.Sleep(1000);     });    watch.Stop();    //非并行情况下循环10次需要10s,因为每次执行Test方法会休息1s    Console.WriteLine("花费时间:" + watch.Elapsed.Seconds);    Console.ReadKey();}public void Test(int num){    Console.WriteLine(num);    Thread.Sleep(1000);}

运行截图如下:
这里写图片描述
Parallel.Foreach<>()写法:

static void Main(string[] args){    Stopwatch watch = new Stopwatch();    watch.Start();    //【写法一】    int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    string[] strArray = { "a","b","c","d","e","f","g"};    //Parallel.ForEach<int>(nums, new DelegateHelper().Test);    //【写法二】    Parallel.ForEach<int>(nums, delegate(int num)    {        Console.WriteLine(num);        Thread.Sleep(1000);    });     //遍历string数组    Parallel.ForEach<string>(strArray, delegate(string str)    {        Console.WriteLine(str);        Thread.Sleep(1000);    });     watch.Stop();    //非并行情况下循环10次需要10s,因为每次执行Test方法会休息1s    Console.WriteLine("花费时间:" + watch.Elapsed.Seconds);    Console.ReadKey();}public void Test(int num){    Console.WriteLine(num);    Thread.Sleep(1000);}

运行结果如下:
这里写图片描述
Parallel.Invoke()写法:

static void Main(string[] args){    Stopwatch watch = new Stopwatch();    watch.Start();    //【写法一】    Action[] actions=new Action[]{        new Action(delegate(){Console.WriteLine("方法一");Thread.Sleep(1000);}),        new Action(delegate(){Console.WriteLine("方法二");Thread.Sleep(1000);}),        new Action(delegate(){Console.WriteLine("方法三");Thread.Sleep(1000);})    };    Parallel.Invoke(actions);    //【写法二】    Parallel.Invoke(Func1, Func2, Func3);      watch.Stop();    //非并行情况下循环10次需要10s,因为每次执行Test方法会休息1s    Console.WriteLine("花费时间:" + watch.Elapsed.Seconds);    Console.ReadKey();}public static void Func1(){    Console.WriteLine("方法一"); Thread.Sleep(1000);}public static void Func2(){    Console.WriteLine("方法二"); Thread.Sleep(1000);}public static void Func3(){    Console.WriteLine("方法三"); Thread.Sleep(1000);}

运行截图如下:
这里写图片描述

异步委托

异步委托可以异步执行委托的方法,不过是用EndInvoke()方法等待委托执行完毕然后获取返回值。
EndInvoke()会阻塞主线程,等到委托的方法执行完毕后,程序才会继续执行,不过EndInvoke()之前的代码会正常执行,一般用于执行相互独立的模块,BeginInvoke异步执行独立模块A,BeginInvoke之后EndInvoke之前执行独立模块B,等到两模块都执行完毕后来进行下一步的操作,这样可以提高一点效率。
没有回调函数:

public void AsyncDelegateNoCallback(){    SayHiEventHandler sayHi = SayHiByChinese;    IAsyncResult iasyncResult = sayHi.BeginInvoke("蝈蝈", null, null);    Console.WriteLine("do some things......");    //有EndInvoke结果如图一,没EndInvoke结果如图二    //string result = sayHi.EndInvoke(iasyncResult);    Console.WriteLine("继续执行");}public string SayHiByChinese(string name){    Console.WriteLine("你好:" + name);    Thread.Sleep(2000);    return "成功";}

这里写图片描述
这里写图片描述
有回调函数:
异步委托所需的回调函数其实就是无返回值、包含一个IAsyncResult类型参数的委托。
回调函数是在委托执行完毕之后才执行,此时EndInvoke()将不会再花费大量时间,因为委托已经执行完毕可直接获取结果。

public void AsyncDelegate(){    SayHiEventHandler sayHi = SayHiByChinese;    IAsyncResult iasyncResult = sayHi.BeginInvoke("蝈蝈",CallBackFunc,"回调函数所需参数");        //回调函数中有EndInvoke,此处不应该再写一次    //sayHi.EndInvoke(iasyncResult);    Console.WriteLine("继续执行主线程");}public void AsyncDelegateAnonymous(){    SayHiEventHandler sayHi = SayHiByChinese;    IAsyncResult iasyncResult = sayHi.BeginInvoke("蝈蝈", new AsyncCallback(delegate(IAsyncResult ias) {        AsyncResult asyncResult = ias as AsyncResult;        //param="回调函数所需参数"        string param = asyncResult.AsyncState.ToString();        SayHiEventHandler current = asyncResult.AsyncDelegate as SayHiEventHandler;        Console.WriteLine("do other things......");        //result="成功"        string result = current.EndInvoke(asyncResult);        Console.WriteLine("继续执行回调函数");    }), "回调函数所需参数");         //回调函数中有EndInvoke,此处不应该再写一次    //sayHi.EndInvoke(iasyncResult);    Console.WriteLine("继续执行主线程");}public void CallBackFunc(IAsyncResult ias){    AsyncResult asyncResult = ias as AsyncResult;    //param="回调函数所需参数"    string param = asyncResult.AsyncState.ToString();    SayHiEventHandler current = asyncResult.AsyncDelegate as SayHiEventHandler;    Console.WriteLine("do other things......");    //result="成功"    string result = current.EndInvoke(asyncResult);    Console.WriteLine("继续执行回调函数");}

运行结果如图:
这里写图片描述

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 行车撞到步行人死亡师机逃离怎么办 小天才平板电脑不显示了怎么办 高德地图导航不显示车速怎么办 桥梁梁片强度达不到设计要求怎么办 新车交车检验表客户没签字怎么办 中铁快运职工拒绝提货要怎么办 奇瑞a3暖风水箱爆了怎么办 别人挖鱼塘占了我的山土怎么办 自己的鱼塘让别人强行占住了怎么办 公路扩路占地占了鱼塘怎么办? 玉米皮编垫子编好后玉米绳怎么办 入户门门框未预留纱窗位怎么办 门和墙有2cm缝隙怎么办 支座预埋钢板忘记埋了怎么办 做完线雕一边紧一边松怎么办 卖家把没发货的填写了单号怎么办 买的人民币白银亏了好多钱怎么办 带控制线的三相四线开关怎么办 覆膜除尘布袋风拉不动怎么办 家里装修把暖气管道打破了怎么办 冷水管与热水管接错了怎么办 磨砂皮的鞋子打湿变硬了怎么办 等离子淡化热处理层渗不够厚怎么办 寄快递快递公司把东西弄坏了怎么办 寄美国的快递客人拒绝清关怎么办 国际e邮宝几天没物流信息了怎么办 石家庄小学网上报名填错了怎么办 去医院看病不知道挂什么科怎么办 深水井深水泵埋了2米怎么办 请问我捡的手机不是我的指纹怎么办 宝宝把塑料子弹塞到了鼻子里怎么办 坐便池上面的小孔不出水怎么办 还没离职已经找好工作怎么办 因火车晚点而耽误下趟火车怎么办 在广州坐的士丢了东西怎么办 找兼职的话他要求交押金怎么办 08vip不给提现了怎么办 点击订阅号所收到内容字太大怎么办 我的小叶栀子花老是黄叶该怎么办? 联币金融倒闭了我投资的钱怎么办 新单位交养老保险不接收档案怎么办