C#多线程:设置一次值并将其与其余所有线程一起使用

时间:2013-05-23 18:19:25

标签: c# multithreading c#-4.0 parallel-processing

当我使用.Net处理multi-threaded应用程序(.Net Windows service)时,我需要确保以下事项。

  • 我使用Delegate BeginInvoke模式在每个不同的线程上调用每个任务(业务场景)。 (这意味着instance method of new object我正在使用iteration of loop中的每个不同线程调用1000个客户端
  • 我在应用程序中有一个场景,第一次(当我的窗口服务启动时),我想在应用程序的某个地方设置标志。 (可能是C#静态字段)
  • 我想确保一旦第一个线程更新值(静态字段),那么线程的所有其他部分必须只使用第一个线程设置的最后一个值。

所以,基本上,我想第一次更新值(of C# static field)(当我的Windows服务启动时),并希望我的所有其他线程都应该使用{{1}设置的最新值}。

所以,我想仅更新值ONCE,然后让其他first thread只使用该值。

有人请告诉我,我将如何实现这一目标?

提前致谢!

4 个答案:

答案 0 :(得分:2)

您可以将Lazy<T>用于此

static Lazy<string> _singleton = new Lazy<string>(() =>
    {
        return new WebClient().DownloadString("http://www.stackoverflow.com");
    }, true);

第二个参数( true )是“isThreadSafe”

现在,您可以使用_singleton.Value;

多次获取多个线程中的值

答案 1 :(得分:0)

看起来像Threadsafe Singleton将完成这项工作。 下面的代码示例使用双重检查锁定

这将确保单例的创建是1次并且线程安全

public sealed class Singleton
{

   private static volatile Singleton singleton = null;
   private static readonly object singletonLock = new object();

   private Singleton() {//place your code here}

   public static Singleton GetInstance()
   {
       if (singleton == null)
       {
           lock (singletonLock)
           {
               if (singleton == null)
              {
                  singleton = new Singleton();
              }
           }
        }

        return singleton;
   }
}

修改:由于成员评论而添加易失性。

答案 2 :(得分:0)

为什么不使用这种类型的单身人士。静态构造函数只调用一次。由于静态初始化是静态构造函数的一部分,因此初始化也只调用一次。关键字volatile不是必需的,因为_instance字段在构建后不能包含任何其他值。

public sealed class Singleton
{
    private static Singleton _instance= new Singleton();

    private Singleton() 
    {
    }

    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }
}

答案 3 :(得分:0)

正如I4V建议的那样 - 使用Lazy<T>并且为了简单起见,我建议将其隐藏在只读属性下:

static readonly Lazy<T> t = new Lazy<T>(() => new T());
static public T Value { get { return t.Value; }}