網(wǎng)站首頁 編程語言 正文
Parallel.Invoke
這個函數(shù)的功能和Task有些相似,就是并發(fā)執(zhí)行一系列任務,然后等待所有完成。和Task比起來,省略了Task.WaitAll這一步,自然也缺少了Task的相關管理功能。它有兩種形式:
Parallel.Invoke( params Action[] actions);
Parallel.Invoke(Action[] actions,TaskManager manager,TaskCreationOptions options);
第二種方式可以自定義一個TaskManager對任務的執(zhí)行線程進行管理(第一種方式用的是默認的TaskManager.Default)。
示例如下:
static void Main(string[] args)
{
var actions = new Action[]{
() => ActionTest("test 1"),
() => ActionTest("test 2"),
() => ActionTest("test 3"),
() => ActionTest("test 4")};
Console.WriteLine("Parallel.Invoke 1 Test");
Parallel.Invoke(actions);
Console.WriteLine();
Console.WriteLine("Parallel.Invoke 2 Test");
Parallel.Invoke(actions, new TaskManager(new TaskManagerPolicy(1, 1, 2)), TaskCreationOptions.None);
}
static void ActionTest(object value)
{
Console.WriteLine(">>> thread:{0}, value:{1}",
Thread.CurrentThread.ManagedThreadId, value);
}
輸出結(jié)果如下:
Parallel.Invoke 1 Test
>>> thread:3, value:test 1
>>> thread:3, value:test 2
>>> thread:4, value:test 3
>>> thread:5, value:test 4
Parallel.Invoke 2 Test
>>> thread:7, value:test 1
>>> thread:7, value:test 2
>>> thread:8, value:test 3
>>> thread:7, value:test 4
可見,由于第二次指定了最多只能使用兩個線程來執(zhí)行,故只有兩個Task并發(fā)執(zhí)行。
Parallel.ForEach和Parallel.For
Parallel.ForEach和Parallel.For用得要更加廣泛一些,他可以根據(jù)一個數(shù)據(jù)源來生成一些任務(Parallel.Invoke需要事先生成這些任務),同時并發(fā)執(zhí)行這些任務。基本示例如下:
static void Main(string[] args)
{
var data = new object[] { "test 1", "test 2", "test 3" };
Console.WriteLine("Parallel.ForEach Test");
Parallel.ForEach(data, item => ActionTest(item));
Console.WriteLine();
Console.WriteLine("Parallel.For Test");
Parallel.For(0, data.Length, index => ActionTest(data[index]));
}
這兩個函數(shù)都有多種重載形式,提供了許多控制功能,由于用得不是很多,這里就不一一介紹了。但有一點不是很好:如果需要用TaskManager的話,不得不用那最復雜的那一種形式。希望最終版本的時候會提供更合理的重載形式,畢竟TaskManager還是很常用的(雖然目前的TaskManager功能薄弱了點),而那些復雜的參數(shù)不是很常用的。因此,這里提供了兩個常用的擴展方法的封裝:
public static class ParallelExtend
{
public static void ParallelForEach<T>(this IEnumerable<T> source, Action<T> hanlder)
{
Parallel.ForEach(source, hanlder);
}
public static void ParallelForEach<T>(this IEnumerable<T> source, Action<T> hanlder, TaskManagerPolicy policy)
{
using (var manager = new TaskManager(policy))
{
Parallel.ForEach(source,
() => 0,
(item, index, state) => hanlder(item),
local => { },
manager,
TaskCreationOptions.None);
}
}
}
通過擴展方法的方式用起來還是比較方便的。
原文鏈接:https://www.cnblogs.com/TianFang/archive/2009/01/10/1373426.html
相關推薦
- 2022-07-28 C++圖文并茂講解類型轉(zhuǎn)換函數(shù)_C 語言
- 2023-02-12 PyCharm軟件無法安裝lxml庫的問題及解決_python
- 2022-06-02 CKAD認證中部署k8s并配置Calico插件_云和虛擬化
- 2023-12-13 SpringMVC——訪問action報404錯誤詳解
- 2022-11-24 GoLang切片相關問題梳理講解_Golang
- 2023-04-11 pandas中實現(xiàn)將相同ID的字符串進行合并_python
- 2024-07-13 Spring AOP 基于注解的方式實現(xiàn)切面遍程
- 2022-09-17 Python?自動控制原理?control的詳細解說_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支