質問: new datbase; db.aaaa(ref m);/* データベースアクセスメソッド */ } else { base.WndProc(ref m); } } } ``` datbaseクラス↓↓↓ ``` public class datbase { public void aaaa() { if (プロセスA) { セマフォ取得; データベースアクセスして処理; セマフォ解放; } else if (プロセスB) { セマフォ取得; データベースアクセスして処理; セマフォ解放; } } } ```
回答: > > > ``` > protected override void WndProc(ref Message m) > { > const int WM_M = ****;//プロセスA,BからWinメッセージ > base.WndProc(ref m); > if (m.Msg == WM_CHAR) > { > datbase db = new datbase; > db.aaaa(ref m);/* データベースアクセスメソッド */ > } > else > { > base.WndProc(ref m); > } > } > > ``` > > ここだけ見ても大量の問題を抱えています。 * `WM_CHAR`.aspx)はキー入力のためのメッセージであり他の用途に使うべきではありません。(誤字かもしれませんが) * `m.Msg != WM_CHAR`の場合に`base.WndProc(ref m);`を2回呼び出すことになっています。どのような状況であっても`base`呼び出しは1回以下となるようにコードを記述する必要があります。 * 全角空白を用いたインデントは避けるべきです。 そして最大の問題は **`WndProc`内で時間のかかる処理をしてはいけない** ということです。データベースアクセスなどもってのほかです。`WndProc`とは別のスレッドでデータベースアクセスすべきです。 > > 一応念のため、セマフォを取得し同時データベースへアクセスし処理を行わないようにしたいと思っています。 > > (同時に処理を行うということはないと思うのですが・・・) > > > 誰かの指示でしょうか? 現状では**全く不要です**。ただし前述のように`WndProc`とは別のスレッドでデータベースアクセスした際に必要となるスレッド同期について説明します。 ここで「セマフォ」が語だけ先行していて意味を正確にとらえていない可能性があります。.NETには同期プリミティブ.aspx)が多数用意されています。`Semaphore`のほかにもpgrhoさんの紹介された`Mutex`や`EventWaitHandle`もあります。1つの処理だけの実行を許可するという機能において`Semaphore`は適切ではなく`Monitor`(クリティカルセクション).aspx)が最適です。`Monitor`クラスを直接使う必要はなく、C#言語に用意されている`lock`ステートメントを推奨します。