2011-02-08 7 views
0

ある時点でマルチスレッドしたいプログラムがあります。私たちはビジネスルールにCSLAを使用しています。私たちのプログラムの1つの場所では、BusinessListオブジェクトを繰り返し処理し、一度に1行ずつデータに対していくつかの健全性チェックを実行しています。行数を約10k行に増やすと、プロセスを実行するのに(約1分)時間がかかります。もちろん、これはTPLのビットを使い、これをマルチスレッド化するのに最適な場所のように聞こえます。マルチスレッドCSLA.NET

私は多年にわたり多大な量のマルチスレッドを行ってきました。だから、シングルスレッドからマルチスレッドへの切り替えの落とし穴を理解しています。私はCSLAルーチン内でコードが爆破されたことに驚きました。これは、CSLA PropertyInfoクラスの背後にあるコードに関連しているようです。

、当社のビジネス・オブジェクト・プロパティーのすべては、このように定義されています。

public static readonly PropertyInfo<string> MyTextProperty = RegisterProperty<string>(c => c.MyText); 
public string MyText { 
get { return GetProperty(MyTextProperty); } 
set { SetProperty(MyTextProperty, value); } 
} 

は、私はマルチスレッドとCSLAについて知る必要があるものはありますか?書面による書類には記載されていない警告がありますか(私はまだ何も発見していません)。

--edit ---ところで

:私はConcurrentBagにすべての行を投げた後、袋が空になるまで、ちょうど袋からオブジェクトをつかむ5かそこらの作業を産卵を経由して、私のマルチスレッドを実装方法。だから私は問題が私のコード内にあるとは思わない。

答えて

1

あなたが発見したように、CSLA.NETフレームワークはスレッドセーフではありません。

あなたの特定の問題を解決するには、Wintellect Power Threadingライブラリを使用します。 AsyncEnumerator/SyncGateコンボまたはReaderWriterGateのいずれか単独です。

Power Threadingライブラリを使用すると、共有リソース(CSLA.NETコレクション)に「読み込み」要求と「書き込み」要求をキューすることができます。キューイングされた '読み取り'または '書き込み'要求をスレッド・ブロッキングすることなく、すべての時点で、単一の「書き込み」要求のみが共有リソースへのアクセスを許可されます。複数のスレッドから共有リソースに安全にアクセスするための非常に巧妙で使い易い。あなたは望む数のスレッドをスピンアップすることができ、Power ThreadingライブラリはCSLA.NETコレクションへのアクセスを同期させます。

+0

これを確認する資料はありますか?それはかなり目障りなデザイン欠陥のようだ。 –

+1

私の経験によれば、ほとんどのCSLAビジネスオブジェクトには、スレッドセーフティが組み込まれている必要はありません。必要が生じた場合、ビジネスオブジェクトをスレッドセーフにすることは、現在開発者次第です。 –