2017-01-10 11 views
0

私はメソッドを持っており、より速く完了するために複数のスレッドを実行したい。vb.netの順番で開始する複数のスレッド

Public Sub createMaster() 
    For intLoop = 0 To _MasterCount - 1 Step _Step 
     _MasterCollection(intLoop) = New Champion(_MasterIDCollection(intLoop), _RRM.returnChampionInformation(_MasterIDCollection(intLoop).Substring(0, _MasterIDCollection(intLoop).Length() - 1), "na")) 
    Next 
End Sub 

したがって、メソッドは基本的に私のためのコレクションを作成します。私はそれをより速く完了するために複数のスレッドを実行しようとしました。チャンピオンを作るのに実際には1秒かかります。 intLoopに特定の変数を設定する方法はありますか?私はintloop = _Startを増やしてみました_毎回1つずつ開始し、すべての種類の数字を開始しました。私の主な内容は次のようなものです:

私はスレッドでForループを使ってみましたが、どちらもうまくいきませんでした。誰もがどのようにこの仕事をする方法を知っていますか?

答えて

2

あなたの_MasterIDCollectionChampionにインスタンスをマップするためにLINQを使用して、あなたの現在のコードを変換することができます:

_MasterCollection = (
    From id In _MasterIDCollection 
    Select New Champion(id, _RRM.returnChampionInformation(id.Substring(0, id.Length() - 1), "na")) 
).ToList() ' or ToArray()? 

LINQはAsParallelを追加することで簡単に並列化されていますが、秩序を維持するためにAsOrderedが必要:

_MasterCollection = (
    From id In _MasterIDCollection.AsParallel().AsOrdered() 
    Select New Champion(id, _RRM.returnChampionInformation(id.Substring(0, id.Length() - 1), "na")) 
).ToList() ' or ToArray()? 

デフォルトでは、PLINQはCPUコアあたり1つのスレッドを実行しますが、WithDegreeOfParallelismを追加することで制御できます。これは価値があるかどうかが行われている作業の種類に依存する(例えば、I/OバウンドまたはCPUバウンド)は:これは、.NET 4+、System.CoreUsing System.Linqへの参照が必要

_MasterCollection = (
    From id In _MasterIDCollection.AsParallel().AsOrdered().WithDegreeOfParallelism(20) 
    Select New Champion(id, _RRM.returnChampionInformation(id.Substring(0, id.Length() - 1), "na")) 
).ToList() ' or ToArray()? 

。詳細は、PLINQ docsを参照してください。

+0

ありがとう、私は別のウェブサイトでそれについて読んだが、あなたの例は私がそれをはるかによく理解するのを助けた。 –

+0

私はあなたの答えを走り、それは素晴らしい仕事をした。しかし、4000個の新しいオブジェクトのようになった後、アプリケーションはクロールしてクラッシュし始めます。それを処理する最善の方法に関するアイデア? –

+0

@RalphMaurmeier '_RRM.returnChampionInformation'と' Champion'コンストラクタが何をしているのか分からず、私は推測しかできません。あなたは 'WithDegreeOfParallelism'と何の値を指定しましたか?アプリのクロールやクラッシュが始まると、CPUやメモリの使用量は多いですか?並行して実行しないとどうなりますか(最初の例)? – Mark

関連する問題