15

私は、WCF Web サービスを使用しているマルチスレッドの c# アプリケーションに取り組んでいます。Web サービスへの接続には、定義可能な特定のタイムアウトがあり、その後閉じられます。シングルトン クラスを使用して Web サービスへの接続を保存しようとしています。次のようにインスタンスを取得しようとしています:

CLazySingleton ins = CLazySingleton.Instance;
string connection = CLazySingleton.abc;

以下は、シングルトン クラスのコードです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LazySingleton
{
    public class CLazySingleton
    {
        private static readonly Lazy<CLazySingleton> _instance
            = new Lazy<CLazySingleton>(() => new CLazySingleton());
        private static readonly object ThreadLock = new object();
        public static string abc;  
        //I will use the service connection object in place of 'abc' in the application
        //assume that 'abc' is storing the connection object    

        private CLazySingleton()
        { }

        public static CLazySingleton Instance
        {
            get
            {   
                if (abc == null)
                {
                    lock (ThreadLock)
                    {
                        //Make the connection
                        abc = "Connection stored in this variable";
                        Console.WriteLine("Connection Made successfully");
                        return _instance.Value;
                    }                    
                }
                else
                {
                    return _instance.Value;
                }
            }
        }
    }
}

私の質問は次のとおりです。1.このコードは、同時にインスタンスを取得しようとする複数のスレッドを処理できますか? これが現在の私の最大の関心事です。2.これに対するより良い解決策はありますか? 3.ここで「ロック」を使用する必要がありますか、それともレイジーアプローチを使用してインスタンスを取得しようとするマルチスレッドを処理しますか?

どんな助けでも大歓迎です。

ありがとう !

4

3 に答える 3

12

Microsoft のLazy Initializationのドキュメントによると、「スレッドセーフな初期化」というタイトルのセクションの下にあります。

デフォルトでは、Lazyオブジェクトはスレッドセーフです。

これを念頭に置いて、フィールドabcは static である必要はありません。を使用しLazy<T>てシングルトンをインスタンス化しているため、CLazySingletonコンストラクターで接続を初期化しても安全です。

于 2013-03-05T11:44:16.910 に答える
5

簡単な使用ThreadSafetyMode

 Lazy<MergeSort> ty = new Lazy<MergeSort>(LazyThreadSafetyMode.ExecutionAndPublication);
于 2013-03-05T11:35:25.183 に答える