3

シングルトンを含む 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);  
    }
}
4

1 に答える 1

1

良い点ですが、サードパーティがスレッドセーフかどうかについての知識はありません。そのため、シングルトンを作成して、Web アプリと API の間の単一の結束点を維持しました。サードパーティ API がスレッド セーフであると確信できない場合は、防御して自分のコードで処理する必要があると思います。おそらく、私は自分の質問に答えたばかりです...この場合、lockObj を使用してこれに対処する良い方法はありますか?

外部メソッドがスレッド セーフであるかどうか確信が持てないという事実を考えると、呼び出しを同期することをお勧めします。

static をロックできますがlockObj、パフォーマンスに注意してください。1 秒あたりのリクエスト数が多い場合、リクエストごとにメソッドが呼び出されるか、1 リクエストあたり 1 回 (またはそれ以上) のクローズ率でメソッドが呼び出されると、問題 (他のリクエストがモニターを解放するのを待っているリクエスト) が発生します。 .

単一のメソッドをロックしているので、 で問題ないはずですlock。したがって、ここではManualResetEventMonitorおよび代替手段は実際には使用されません。

于 2012-07-06T11:58:34.667 に答える