并行Foreach缓慢创建线程

我有一个需要并行处理的很多项目的IEnumerable。 这些项目不是CPU密集型的。 理想情况下,这些项目应该同时执行100个或更多的线程。

我试图用Parallel.ForEach()来做到这一点。 这有效,但问题是新线程产生得太慢。 在Parallel.Foreach()达到100个线程之前需要很长时间。 我知道有一个MaxDegreeOfParallelism属性,但这是最大值,而不是最小值。

有没有办法在100个线程上立即执行foreach? ThreadPool.SetMinThreads是我们宁愿避免的,因为它对整个过程有影响。

是否有自定义分区程序可能的解决方案?


我以5秒的超时时间ping了很多设备。 你如何尽可能快地做到这一点,只有4个线程(4个核心)?

我将假设您的ping设备位于局域网中,并且每个设备都可以通过IP地址进行识别和访问。

namespace PingManyDevices {

    public class DeviceChecker {                

        public async Task<PingReply[]> CheckAllDevices(IEnumerable<IPAddress> devices) {
            var pings = devices.Select(address => new Ping().SendPingAsync(address, 5000));
            return await Task.WhenAll(pings);
        }
        /***
        * Maybe push it a little further
        ***/ 
        public async Task<PingReply[]> CheckAllDevices(IEnumerable<IPAddress> devices) {
            var pings = devices.AsParallel().Select(address => new Ping().SendPingAsync(address, 5000));
            return await Task.WhenAll(pings);
        }          
    }
} 

我已经成功使用ThreadPool而不是Parallel:

public static void ThreadForEach<T>(this IEnumerable<T> items, Action<T> action)
{
    var mres = new List<ManualResetEvent>();

    foreach (var item in items)
    {
        var mre = new ManualResetEvent(false);

        ThreadPool.QueueUserWorkItem((i) =>
        {
            action((T)i);
            mre.Set();
        }, item);

        mres.Add(mre);
    }

    mres.ForEach(mre => mre.WaitOne());
}

在我不得不使用它的情况下,它比使用Parallel.ForEach的尝试运行得更快。 我只能推测这是因为它试图使用已经存在的线程(而不是花费开销来创建新线程)。

链接地址: http://www.djcxy.com/p/50173.html

上一篇: Parallel Foreach slow creation of the threads

下一篇: What is the advantage of a parallel pipeline compared with Task Parallelism?