tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルBackgroundWorkerを複数使用する
記事No10595
投稿日: 2011/09/19(Mon) 23:19
投稿者ゆみこす
最近、VB2005を使用し始めて(今まではVB6でした)
マルチスレッドの「BackgroundWorker」の利用を勉強しています。

時間がかかる処理(データベースへのインポート・ファイル入出力・
データベースからのSELECT結果をDataGridViewへDatasetで当てるetc)が
一つのアプリケーション内で幾つか有ると判断した場合、それらの
処理に“それぞれ”別のBackgroundWorkerを使用するのが良いのでしょうか?
(フォームデザイン上、複数のBackgrounWorkerが配置されている状態)

作成するアプリケーションによっては、場合によって、極端な話し、
10個・100個の複数のBackgroundWorkerが配置されているモノもあるのでしょうか?

現在、当方で作成予定のアプリケーションの仕様を検討している所ですが、
そのような時間のかかる処理は、多くて5個程だと言う事をイメージしています。
(つまり、5個のBackgroundWorkerを配置しようと検討しています)

例えば、BackgroundWorkerの配置する数が多いと、アプリケーション自体が
重くなってしまうとか、そのようなデメリット等があれば教えて頂きたいと思います。

そのようなBackgroundWorker使用の考え方などがあれば御意見頂きたいのです。

お願い致します。

[ツリー表示へ]
タイトルRe: BackgroundWorkerを複数使用する
記事No10596
投稿日: 2011/09/20(Tue) 22:35
投稿者オショウ
> 例えば、BackgroundWorkerの配置する数が多いと、アプリケーション自体が
> 重くなってしまうとか、そのようなデメリット等があれば教えて頂きたいと思います。

  非常に軽い処理なら100個あっても軽い場合もあるし、重い処理なら
  1個でも重い・・・

  メリット・デメリットと言うよりは、重くなりそうな処理を分割して
  順次バックグランドで実行させて軽くふるまわせる・・・と言う様な
  使い方になるのでは?と思いますが。

> そのようなBackgroundWorker使用の考え方などがあれば御意見頂きたいのです。

  私の場合、FAのプログラマーなんで、制御とかの動作のストーリー
  をBackgroundWorkerを使って実現させたりなんかもしてます。

  PLCのラダー的な動作の応用ですかネ〜

以上。

[ツリー表示へ]
タイトルRe: BackgroundWorkerを複数使用する
記事No10597
投稿日: 2011/09/21(Wed) 03:34
投稿者魔界の仮面弁士
> マルチスレッドの「BackgroundWorker」の利用を勉強しています。
ワーカースレッドが UI スレッドに干渉しないように注意してくださいね。
(DoWork イベントから TextBox を読み書きしたり、フォームのフィールド変数を
複数のスレッドで共有するような作りにしてはいけないということです)


> 処理に“それぞれ”別のBackgroundWorkerを使用するのが良いのでしょうか?
> (フォームデザイン上、複数のBackgrounWorkerが配置されている状態)
それでも構いませんし、実行時に動的に BackgroundWorker を生成することもできます。

また、DoWork が数多く記述されるとしても、同時に実行されるスレッド数が
さほど多くない(数個程度)のであれば、AddHandler / RemoveHandler を利用して
使用済みの BackgroundWorker を別の処理で使いまわすことも一応可能です。


> 作成するアプリケーションによっては、場合によって、極端な話し、
話し→話

> 10個・100個の複数のBackgroundWorkerが配置されているモノもあるのでしょうか?
デザイン時に配置するということは、配列等は用いず、すべて別の変数名になりますね。
100 個も配置されていたら管理が追い付かなくなるので、個人的には NG としたいです。

まぁ、それは BackgroundWorker に限った話では無いのですけれども。
(たとえば、Timer を100個貼ったフォームや、DataGridView 100 個とかも避けたいところ)

100個のうち何個までが同時実行(並列稼働)の対象となるのかは分かりませんが、
それぞれがまったく異なる作業を行うような場合には、処理内容に応じて、
ある程度の作業グループごとに分け、フォーム以外のクラスを作成して
管理したほうが良いかも知れません。
また、その過程で BackgroundWorker 以外の選択肢が併用されることもありそうです。

たとえば Web Service を使っているのであれば、Web メソッドの Async バージョンを
利用できますし、あるいは自分で Thread を生成するのも手かと思います。
あるいは ADO.NET 2.0 の非同期コマンド実行とか、非同期 IO 用メソッドとか。


> そのような時間のかかる処理は、多くて5個程だと言う事をイメージしています。
> (つまり、5個のBackgroundWorkerを配置しようと検討しています)
5 個程度なら問題ないと思いますよ。CPU が 5 コア以上なら尚良し。

[ツリー表示へ]