wpfアプリケーションでシングルトンパターンを使用していますが、複数のスレッドで動作させる方法に疑問があります。C#2つの異なるスレッドからシングルトンを操作する
私はMonitorと呼ばれるクラスを持っています。このクラスは、「デバイス」ごとに監視する「設定」のリストを保持しています。以下に概要を示します。私は、ユーザーの入力に応じて、 Monitor.getMonitor.register(ウォッチリスト)またはMonitor.getMonitor.unregister(...を)やっていると私は モニターを行うごとに200ミリ秒を実行しているDispatchTimerを持っている私のメインスレッドで
。 getMonitor.update()
public class Monitor
{
private Hashtable Master; //key=device, value=list of settings to watch
private static Monitor instance = new Monitor();
private Monitor() {}
public static Monitor getMonitor()
{
return instance;
}
public void register(watchlist){...}
public void unregister(...){...}
public void update(){...}
}
register()/ unregister()hastableにadd/removeを実行します。 update()はハッシュテーブルからの読み込みのみを行います。
デバイスと設定の数に応じて、update()は、最新の値を取得して、ハステーブルとその内容を繰り返し処理します。 メインスレッドはregisterとregisterを頻繁に呼び出すかもしれません。私はGUIが応答性を保つことを望みます。これを行うには良い方法はありますか?
ハッシュテーブルをロック/ロック解除したりロックしたりするだけです。ハッシュテーブルに入る可能性のある奇妙な状態を捕まえるためにtry catch(alaは正常に失敗します)これを行うよりよい方法がいくつかあります(もしもアップデートが失敗しても何の問題も起こらないでしょう)。
何が起こっているのか分かりませんが、コード自体が実際に問題を示しているように見えます。任意の提案をありがとう...
ReaderWriterLockSlimの良い言及。それはまだ見たことがありませんでした。 – Joe
すごく早かった。応答していただきありがとうございます。これをちょっと試して理解してみてください。イタリック体でそれを詳しく教えてください。 私は3.5を使用しています。そして、.NETのコンベンションのリマインダーに感謝します。これは、1人のプロジェクトのようなものです。 – Sharun
@Jon Singletonsに関する素晴らしい記事。私はJavaのダブルチェックロックの問題を認識していましたが、ネストされたクラスのシングルトンを作成することに気づいていませんでした。 CLR via C#は、私が同じことを成し遂げていると思うもっと簡単なテクニックを持っています。 – RichardOD