我想知道替代做toProcess.RemoveAll
,但並行。今天我的例子代碼運行良好,但順序,我想平行。列表<T>。刪除所有並行
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; }
}
}
爲什麼?你確定這是最耗時的部分嗎?似乎不太可能。 –
帕特里克剛剛回答。也許'BlockingCollection'是你在這裏選擇的。它是一種生產者消費類型的集合 – pushpraj
您可以使用並行LINQ獲取可移動項目的列表,從中構建一個哈希集合,最後使用list.removeall和hashset.contains進行實際刪除 – CodesInChaos