C#小知识:优雅地执行并行任务

我们在做多开组队脚本的时候,有时会遇到这样的逻辑:
所有队员都去执行同一个处理,比如申请入队
等所有队员这个处理都 执行完了,队长再去执行下一个处理,比如同意申请.
这个时候每个队员的处理是多个线程并发执行的,都执行完才去执行后续处理.
在按键,TC,E语言等常用开发工具中,这个逻辑普遍用线程来实现
以下是伪代码,明白意思就好
//1,先有个数组,存放每个线程需要的参数,比如窗口句柄
var 句柄数组[4]

//2,为了操作线程,再定义个数组,用于存放线程ID
var 线程ID[4]

//3,循环开启线程,并保存线程ID
for(var i = 0; i < 3; i++)

        线程ID[i] = 开启线程(“申请入队”, 句柄数组[i], )
    end

//4,再写个死循环,等待所有线程的状态都结束
While
//遍历线程ID数组,判断状态.直到所有线程状态为结束,才退出循环

for(var i = 0; i < 3; i++)

    if(threadgetstatus(线程ID[i]))
XXX
    else
XXX
    end
end

End

 

以上代码逻辑正确,就是写起来太罗嗦.在C#中提供了一个语法糖,使得上边这一坨大大简化
Parallel 关键字闪亮登场,自带遍历功能.以下是例子

Parallel.ForEach(句柄List, (hwnd, loopState) =>
{
    申请入队(hwnd);
});

句柄list     存放所有的句柄,
hwnd        不需要额外定义,就是遍历数组时候的每一项
申请入队  要执行的功能.是并行执行,全部执行完这个语句才会结束
loopState 内置的状态对象,访问这个对象就知道当前的执行情况,比如执行完了几个等等
开线程,等待线程结束这些操作被封装了.程序员不需要关心
代码变简洁了,bug也变少了
小伙伴们get到了么

本文为原创文章,转载请注明出处!