【发布时间】:2016-02-28 22:52:26
【问题描述】:
我正在并行化一个高度依赖 WinAPI NetAPI32 调用的方法。如果用户输入的主机已关闭或数百个列表中的多个主机,调用有时会超时。
int prevThreads, prevPorts;
ThreadPool.GetMinThreads(out prevThreads, out prevPorts);
ThreadPool.SetMinThreads(20, prevPorts);
var parallelScanList = computersToScan.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism).WithDegreeOfParallelism(20);
Api.WinApi.AdvApi.LogonAndImpersonate(connection.UserCredential);
foreach (var computer in parallelScanList)
{
//...
//this takes a long time to timeout
status = NetApi.NetUserEnum(computer.DnsHostname, 2,
(int)NetApi.NetUserEnumFilter.FILTER_NORMAL_ACCOUNT,
out userbufPtr, (int)LmCons.MAX_PREFERRED_LENGTH, out userEntriesRead, out totalEntries,
out userResumeHandle);
}
我们在使用消费者/生产者的 C 客户端中具有与此类似的逻辑。启动 20 个线程并让它们读取一个列表,直到它耗尽。
function StartProcessingHosts()
{
for 1 to 20
StartProcessThread()
}
function ProcessHostsThread()
{
while(moreHosts)
{
//obviously synchronization around here
var host = popHost();
DoSomething(host);
}
}
而且速度非常快,因为这些网络调用一直在等待,并且可能无法连接到停机主机。
我目前在 C# 中的做法似乎是一次一个。
【问题讨论】: