私は現在、マルチスレッド化することでwinformアプリケーションのパフォーマンスを向上させようとしています。現在、クラスは次のようになります。マルチスレッドによるパフォーマンスの向上
public class MainClass
{
List<DataItem> data; //thousands of DataItem, but each is independent
//and a lot of non-thread-safe variables here,variable1 variable2 ...
public void Go()
{
data.ForEach(item => DealWithDataItem(item));
}
public void DealWithDataItem(DataItem item)
{
//costs really long time here
Step1(item);
Step2(item); //and a lot of StepN(item)
}
public void StepN(DataItem item)
{
//variable1 = blabla
//variable2 = blabla ..etc
}
}
私はそれぞれのDataItemのためThreadPool
を使用したいです。
data.ForEach(item => ThreadPool.QueueUserWorkItem(s => DealWithDataItem(item)));
非常に多くのスレッドセーフではない変数です。私はStepN
メソッドの間で共有されているので、何らかの方法でそれらを宣言することはできません。そして、それらをスレッドセーフにすることは非常に難しいです!私は間違って何かしていますか?良い解決策はありますか?ありがとう!
は十分なバックグラウンドではありませんか? –
それは本当にあなたが変数1で何をするかによって決まります。彼らは値を合計しますか?読みますか?書きます?これらの変数の使用法については、より具体的に説明する必要があります。さまざまな使用パターンにはさまざまなソリューションがあります。 –
わかりません。'MainClass'はすべての' DataItem'の進捗状況を処理する全体的な進捗状況を監視するものです(MainClassの状態として必要です)。そうでない場合は、作業ごとに個別のオブジェクトを作成することを検討してください。 –