2011-09-01 11 views
0

私はいくつかのイベントでバックグラウンドを開始しています。 私はそれが可能かどうか疑問に思っています: 私はworkerを起動していますが、このスレッド内でいくつかの新しいスレッドを開始できますか? 可能であれば、パフォーマンスにどのような影響を与えますか? 私のアプリでは現在3つのスレッドがありますが、1つのスレッドで約60の新しいスレッドを作成できます。 なぜ60ですか? 私は60個の複雑なコントロールを持っています。コントロールから1つのスレッドに制御を移そうとします。別のスレッドから少数のスレッドを実行してください

よろしくお願いします。Greg

+0

これらは、コントロールのどのような種類がありますか? WPF? WinForms?コントロールを作成したスレッド(通常は単一のGUIスレッド)にアクセスできるので、コントロールごとのスレッドを持つことはあまり役に立たないでしょう。どのような問題を解決しようとしていますか? – dlev

+1

これがwinforms(またはWPFだと思います)の場合、コントロールのプロパティを変更することは、それらを作成したスレッドで行う必要があります。また、60スレッドは非常に効率が悪いようです。 –

答えて

2

複数のスレッドを1つのスレッドから開始することは可能です。しかし、コントロールによってUIコントロールを意味する場合、コントロールを実際に更新できるようにするには、メインのUIスレッドが必要です。

スレッドは、メインのUIスレッドがコントロールに適用するデータを変更できる可能性がありますが、同期には注意が必要です。本当に面倒なことがあります。

パフォーマンスに関しては、スレッドはオーバーヘッドを意味するため、アプリケーションによっては、バックグラウンドで60個のコントロールのデータを扱うスレッドを1つしか持たず、UIスレッドでコントロールを更新することもできます。しかし、それは実際にアプリケーションとバックグラウンドでデータを取得して処理する方法に依存します。

0

UIコントロールを管理するためだけに60個のスレッドを実装する必要がある場合は前述のように、デザインに何か問題がある可能性が非常に高いです。

しかし、スレッド数を決定するときは、競合やロック機構などの要素を考慮する必要があります。たとえば、すべてのスレッドが多くの読み取り値を持つ共有データを使用している場合は、アクセスを管理するためにReaderWriterLockSlimを使用することを検討する必要があります(いずれの状況でも、重量型のReaderWriterLockクラスは使用しないでください)。代わりに、セマフォーやノンブロッキング同期化方法に応じて、ここでは役に立つかもしれません。 WPFでは

あなたがバックグラウンドスレッドからUIコントロールにアクセスするためにアクセスする必要がある場合、以下のように、あなたがディスパッチャを使用することができますが:

private void AddTbToStackPanel(string text) 
{ 
    Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => 
    { 
     StackPanel stackPanel = stackPanel1 as StackPanel; 
     TextBlock tb = new TextBlock(); 
     tb.Text = text;     
     stackPanel.Children.Add(tb); 
    })); 
} 
関連する問題