1

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

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

所以,基本上,我只想of C# static field第一次更新值()(当我的 Windows 服务启动时),并希望我的所有其他线程应该使用first thread.

所以,我只想更新一次值,然后让其他人thread should只使用那个值。

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

提前致谢!

4

4 回答 4

2

你可以用Lazy<T>这个

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

第二个参数 ( true ) 是 "isThreadSafe"

现在您可以在多个线程中多次使用_singleton.Value;

于 2013-05-23T18:59:11.623 回答
0

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

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

    private Singleton() 
    {
    }

    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }
}
于 2013-05-23T18:51:10.230 回答
0

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

static readonly Lazy<T> t = new Lazy<T>(() => new T());
static public T Value { get { return t.Value; }}
于 2013-05-23T19:38:02.693 回答
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;
   }
}

编辑:由于成员评论而添加 volatile。

于 2013-05-23T18:26:44.327 回答