【发布时间】:2015-08-23 14:13:53
【问题描述】:
在为 Oracle 数据库查询和 Active Directory 查询生成两个单独的任务然后等待两者时,您是否发现任何陷阱或问题。
下面是一个非常基本的精简示例。本质上,我们有一个员工对象,它是从 AD 和 Oracle DB 的信息中创建的。 (顺序调用)
var partialEmployeeA=ActiveDirectoryLookup(employeeID);
var partialEmployeeB=OracleDBLookup(employeeID);
var finalEmployee=Merge(partialEmployeeA,partialEmployeeB);
此时Employee 对象已创建并从两个查询拼凑在一起并且可以使用。这没有问题,但如果这些调用中的每一个都是它自己的任务,你会从扩展的角度看到任何问题吗? (不包括任何其他明显的代码问题)
Employee partialEmployeeA;
Employee partialEmployeeB;
var t1 = Task.Run(() => {
partialEmployeeA=ActiveDirectoryLookup(employeeID);
});
var t2 = Task.Run(() => {
partialEmployeeB=OracleDBLookup(employeeID);
});,
Task.WaitAll(t1, t2);
var finalEmployee=Merge(partialEmployeeA,partialEmployeeB);
我对秒表类进行了一些测试,Task 版本每次都恢复得更快(平均:100-120 毫秒 vs 200-250 毫秒)并且没有问题,但不确定在多核系统上如何扩展.我没有对 TPL 做过很多,但对这种方法很好奇。
【问题讨论】:
标签: c# .net multithreading task-parallel-library task