列出<T> .RemoveAll为并行

Sol*_*rio 0 c# linq multithreading generic-collections task-parallel-library

我想知道做一个的替代方案toProcess.RemoveAll,但并行.今天我的代码就像我的例子一样运作良好,但顺序,我想和平相处.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ParallelTest
{
    using System.Threading;
    using System.Threading.Tasks;
    class Program
    {
        static void Main(string[] args)
        {
            List<VerifySomethingFromInternet> foo = new List<VerifySomethingFromInternet>();
            foo.Add(new VerifySomethingFromInternet(@"id1", true));
            foo.Add(new VerifySomethingFromInternet(@"id2", false));
            foo.Add(new VerifySomethingFromInternet(@"id3", true));
            foo.Add(new VerifySomethingFromInternet(@"id4", false));
            foo.Add(new VerifySomethingFromInternet(@"id5", true));
            foo.Add(new VerifySomethingFromInternet(@"id6", false));

            DoSomethingFromIntert bar = new DoSomethingFromIntert();

            bar.DoesWork(foo);
            Console.ReadLine();
        }
    }

    public class DoSomethingFromIntert
    {
        bool RemoveIFTrueFromInternet(VerifySomethingFromInternet vsfi)
        {
            Console.WriteLine(String.Format("Identification : {0} - Thread : {1}", vsfi.Identification, Thread.CurrentThread.ManagedThreadId));
            // Do some blocking work at internet
            return vsfi.IsRemovable;
        }

        public void DoesWork(List<VerifySomethingFromInternet> toProcess)
        {
            Console.WriteLine(String.Format("total : {0}", toProcess.Count));
            //Remove all true return
            toProcess.RemoveAll(f => this.RemoveIFTrueFromInternet(f));
            Console.WriteLine(String.Format("total : {0}", toProcess.Count));
        }
    }
    public class VerifySomethingFromInternet
    {
        public VerifySomethingFromInternet(string id, bool remove)
        {
            this.Identification = id;
            this.IsRemovable = remove;
        }
        public string Identification { get; set; }
        public bool IsRemovable { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*hnB 6

var newList = toProcess.AsParallel ()
               .Where (f => !this.RemoveIFTrueFromInternet(f))
               .ToList ();

toProcess = newList;
Run Code Online (Sandbox Code Playgroud)

可能这会回答你的问题,但我不确定它真的更快.尝试并衡量.

请注意,这可能会更改列表中元素的顺序.如果您关心订单,请在AsOrdered之后添加AsParallel.(感谢weston的[隐含]提示).