2

膨大な数の統計とグラフを頻繁に表示するC#winformアプリケーションを実行しています。このアプリケーションは複数のフォームで構成されており、各フォームの出力は異なります。タスクマネージャーを開いてCPU使用率を確認すると、8つのコアのうち1つのコアだけがオーバーロードされており、残りは何も実行していないことがわかります。たとえば、フォームの各数をコアに割り当てる方法はありますか?パフォーマンスを改善する必要があります。

私が探しているのは、各フォームが異なるコアで実行されている異なるスレッドを持つように、winformをマルチスレッド化することです。それは可能ですか?

ボトルネックは、データをコントロールにロードすることで発生しています。

4

3 に答える 3

2

1つのWinFormsアプリケーションに複数のUIスレッドを含めることができます。各UIスレッドはApplication.Run()を呼び出す必要があり、Main関数の場合と同じように、それぞれへのエントリポイントを[STAThread]でマークする必要があります。

私はこれを成功裏に実行しました。UIスレッドで多くの作業を行っている既存のコードベースに直面した場合、これは合理的なアプローチです。しかし...これは、他の方法で改善できる設計の症状だと思います。UIスレッドで多くの作業を行っている場合は、他のスレッドでその作業を行う方法を検討してください。私のアプリでは、UI以外のスレッドで重要な作業をすべて実行しようとしました。それは可能ですが、ソフトウェアを提供するための最速の方法であるとは限りません。

他の作業を行わない場合は、1つのUIスレッドで、数字とグラフでいっぱいの8つの画面を描画し、人間が追いつくことができないほど頻繁に更新することができます。私はこれが事実であることを知っています:-)

于 2012-10-23T13:47:44.223 に答える
0

これは技術的に実行可能であり、(私の経験では)WinFormsよりもWPFの方が柔軟性がありますが、どちらでもお勧めできません。Windowsクライアントアプリは、UIの描画を担当する単一のスレッドで実行される傾向があります。通常、バックグラウンドスレッドは、データアクセスまたはビジネスロジックのバックグラウンド処理に使用されます。さらに、レンダリングパフォーマンスが実際に問題になるには、UIで多くの作業を行う必要があります。これは、私には不要な作業のように思えます。

ただし、WinFormsの基本的なスタイルは次のようになります。

var t = new Thread(() =>
        {
            var f = new Form1();
            Application.Run(f);
        })
t.Start();

知っておくべきこと:

  • Invokeフォームが正しいスレッドにあることを確認するために、フォーム間を常に呼び出す必要があります。
  • ビジネスレイヤーにスレッドアフィニティがある場合は、それを使用するフォームごとに1つのインスタンスが必要になります。
  • アプリケーションのシャットダウンは通常、メインスレッドのフォームが閉じたときに発生します。シャットダウンを手動で処理する必要がある場合がありますが、上記のコードでは2つのメッセージループが実行されており、どちらかがもう一方のフォームが閉じたときにアプリを存続させます。
于 2012-10-23T13:49:27.077 に答える
0

必要に応じて、データの処理、I / Oからの受信、解析などを、別のスレッドまたは複数のスレッドで常に実行してください。

次に、UIコントロールに大量のデータをロードする場合は、入力ストリームからすべてのアイテムを個別に呼び出し、1秒あたり数千のアイテムがある場合のようにUIスレッドと頻繁に同期しないようにしてください-WinForms停止します。

バックグラウンドスレッドでビジュアルデータの変更をキューに入れ、これを頻繁に行わないように、最小限の間隔でUIスレッドにバッチ処理します。スレッドの同期にはコストがかかります。AddRangeはあなたの友達です。

于 2012-10-23T13:50:35.073 に答える