C#並列計算テスト
2927 ワード
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
//aa();
//bb();
//Parallel.For(0, 100, (x) => //
//{
// Console.WriteLine(x);
//});
var list = GetProcuctList();
Parallel.For(0, 100, (x, loopstate) =>
{
if (x < 50)
Console.WriteLine(x);
else
{
loopstate.Break();
return;
}
});
Console.ReadKey();
}
private static void aa()
{
List<int> arrlist = new List<int>();
Enumerable.Range(0, 100)
.AsParallel()
.ForAll((x) =>
{
if (x % 2 == 0 && (x + 1) % 3 == 0)
{
arrlist.Add(x);
}
});
arrlist.ForEach((x) => Console.WriteLine(x));
}
private static void bb()
{
List<Product> ProductList = GetProcuctList();
Parallel.ForEach(ProductList, (model) =>
{
Console.WriteLine(model.Name);
});
}
private static List<Product> GetProcuctList()
{
List<Product> result = new List<Product>();
for (int index = 1; index < 100; index++)
{
Product model = new Product();
model.Category = "Category" + index;
model.Name = "Name" + index;
model.SellPrice = index;
result.Add(model);
}
return result;
}
}
class Product
{
public string Name { get; set; }
public string Category { get; set; }
public int SellPrice { get; set; }
}
Stopを呼び出し、Parallelを表します.Forの実行は、他の実行ユニットが停止条件に達しているかどうかにかかわらず、すぐに停止します.一方、我々がBreakを使用すると、条件を満たす現在の実行手段は直ちに停止し、他の実行手段についても、停止条件を満たすものはBreakによって停止し、他の停止条件を満たさないものは引き続き実行し、すべての実行が完了し、自然に停止する.すべての実行ユニットが停止すると、Parallel.Form関数が停止して終了します.
breakはforのcontinueに似ており、stopはforのbreakに似ている.
以下の内容はMSDNに抜粋します.
各値に対してbody依頼を1回呼び出し、反復範囲(fromIncluusive,toExclusive)にします.反復回数(Int 32)と、ループを早期に終了するために使用できるParallelLoopStateインスタンスのパラメータがあります.現在の反復を実行する必要がない場合、Breakメソッドを呼び出してfor操作反復を通知します.ただし、現在の反復の前のすべての反復は、まだ実行されていない場合は、実行する必要があります.したがって、Breakを呼び出すことは、C#などの言語の従来のforループで使用されている割り込み操作と似ていますが、現在の反復以降の反復が実行されないことは保証されません.現在の反復が不要になる前にすべての反復を実行する場合は、BreakではなくStopメソッドを使用します.Stopを呼び出すと、forループが現在の反復の上にあるか下にあるかにかかわらず、すべての必要な作業が完了しているため、残りの反復をすべて放棄する可能性があることが通知されます.しかしBreakでは,他の反復を実行しないという保証はない.ループが早期に終了すると、返されるParallelLoopResult構造には、ループの完了に関する情報が含まれます.fromInclusiveがtoExclusive以上である場合、このメソッドは反復を実行することなくすぐに返されます.