シングルトンを含む DLL を参照する ASP.Net アプリケーションがあります。シングルトンには、パブリックにアクセス可能なメソッドが 2 つだけ含まれており、パブリック プロパティは含まれていません。Web アプリは、Application_Start 中にこのシングルトンのインスタンスを作成します。これは、アプリケーションのライフスパン全体で利用できます。
シングルトンは、サード パーティ アプリケーションへの接続を維持し、サード パーティ アプリケーションで発生するさまざまなイベントをリッスンします。これらのイベントは、発生時にログに記録され、シングルトン内で処理されます。
ユーザーが Web アプリにアクセスすると、リクエストはシングルトンのパブリック メソッドを使用し、プライベート メンバー データを使用してサード パーティ アプリケーションのメソッドを呼び出します。これらの呼び出しは、try...catch ブロック内にあります。
スレッド セーフを維持するためにパブリック メソッドをロックする必要がありますか?ロックする目的でのみ使用される System.Object 型の単純なプライベート メンバーで十分でしょうか?
シングルトンの「疑似コード」を次に示します。私の質問が理解できるものになったことを願っています。
using My3rdPartyDLL;
public sealed class MySingleton
{
private static MySingleton instance = new MySingleton();
private Object lockObj = new Object();
private My3rdPartyAPI myAPI = null;
public static MySingleton Instance
{
get{ return instance; }
}
static MySingleton()
{
}
private MySingleton()
{
Initialise(); // Creates third party API and hooks up events.
}
// Here is the public method that I want to ensure is
// thread safe.
public void SomePublicMethod(String myString)
{
lock (lockObj)
{
try
{
My3rdPartyDLL.MyMethod(myString);
}
catch (Exception ex)
{
// deal with exception
}
}
}
private void My3rdParty_Event(EventObj obj)
{
MyEventLogger.WriteToLog(obj);
}
}