2016-12-21 12 views
-2

私は65000文字列のタイプ文字列のリストを持っています。私はこれらの文字列のすべてをループして何らかの作業をする必要があります。 forループを実行して65000回反復処理すると時間がかかります。ですから、このリストデータを分割して10000〜15000のデータを個別に実行できる4〜5スレッドを開始したいと思います。 Threadクラスを使ってスレッドの開始と中断について理解しました。しかし、私はマルチスレッドとスレッド管理とロックの実装を実装していないので、複数のスレッドが同じデータに対して実行されず、実行順序が変更されることはありません。スレッドでforループを実行するマルチスレッドを実装しています

私はスレッディングの概念が初めてです。助けてください。どのようなコード例もありがとうございます。
ありがとうございます。

+0

[Parallel.For](https://msdn.microsoft.com/en-us/library/system.threading.tasks (v = vs.110).aspx) – Jens

+0

'Thread'を使わないでください!代わりに 'Task'を使用し、フレームワークがスレッドプール上でどのようにタスクが処理されるかを処理させます。また、リストから読んでいるだけの場合は、ロックする必要はありません。 – EpicSam

+0

.NETの 'Parallel.For'またはPLINQを使わないのはなぜですか?なぜあなた自身で書くのですか? –

答えて

3

私は最初の試みとしてPLINQ(パラレルのLINQ)をお勧め:

myList 
    .AsParallel() 
    .WithDegreeOfParallelism(4) 
    .ForAll(item => MyRoutine(item)); 

別のオプションがParallel.ForEachです:

ParallelOptions op = new ParallelOptions() { 
    MaxDegreeOfParallelism = 4, 
    }; 

    Parallel.ForEach(myList, op, item => MyRoutine(item)); 

編集:気をつけて、多くのクラスはスレッドではありません安全なList<T>が含まれています(下記のコメントを参照)。あなたがリストにデータを実体化したい場合は、PLINQでそれを行う:

List<string> listStrings = myList 
    .AsParallel() 
    .WithDegreeOfParallelism(4) 
    .Select(item => item.text.Substring(5, item.text.Length))) 
    .ToList(); // <- this is thread safe 
+0

です。こんにちは、私はあなたの最初のコードを疲れました。 65000レコードすべてを実行していないので、64790レコードだけの結果が得られます。 –

+0

@Naveen kumar:*例外が投げられましたか? –

+0

例外はスローされません。コードは実行されていますが、結果は正確ではありません。 –

関連する問題