次のコードがあるとします (すべての適切なインポート ステートメントを想定してください)。
public class CTestClass {
// Properties
protected Object LockObj;
public ConcurrentDictionary<String, String> Prop_1;
protected System.Timers.Timer TImer_1;
// Methods
public CTestClass () {
LockObj = new Object ();
Prop_1 = new ConcurrentDictionary<String, String> ();
Prop_1.TryAdd ("Key_1", "Value_1");
Timer_1 = new System.Timers.Timer ();
Timer_1.Interval = (1000 * 60); // One minute
Timer_1.Elapsed += new ElapsedEventHandler ((s, t) => Method_2 ());
Timer_1.Enabled = true;
} // End CTestClass ()
public void Method_1 () {
// Do something that requires Prop_1 to be read
// But *__do not__* lock Prop_1
} // End Method_1 ()
public void Method_2 () {
lock (LockObj) {
// Do something with Prop_1 *__only if__* Method_1 () is not currently executing
}
} // End Method_2 ()
} // End CTestClass
// Main class
public class Program {
public static void Main (string[] Args) {
CTestClass TC = new CTestClass ();
ParallelEnumerable.Range (0, 10)
.ForAll (s => {
TC.Method_1 ();
});
}
}
MethodBase.GetCurrentMethod を使用できることは理解していますが、(グローバル変数を使用して煩雑な簿記を行う以外に) リフレクションなしで問題を解決することは可能ですか?
よろしくお願いいたします。
編集
(a) LockObj のスコープの誤りを修正
(b)説明としてもう少し追加します(以下の私のコメントから取得)
(実際のプロジェクトで) コードを修正し、LockObj をクラス プロパティとして配置しました。問題は、Method_2 が実際には System.Timers.Timer によって起動され、起動する準備が整ったときに Method_1 が既に実行されている可能性が高いことです。ただし、その場合は、Method_1 の実行が完了するまで待ってから Method_2 に進むことが重要です。
私が作成しようとした最小限の実用的な例では、この後者の点が明確になっていないことに同意します。MWE を編集できるかどうか見てみましょう。
コードの編集が完了しました
1 つの最終編集
私は Visual Studio 2010 と .NET 4.0 を使用しているため、私の生活をずっと楽にする async/await 機能がありません。