当我使用.Net处理multi-threaded
应用程序(.Net Windows service
)时,我需要确保以下事项。
Delegate BeginInvoke
模式在每个不同的线程上调用每个任务(业务场景)。 (这意味着instance method of new object
我正在使用iteration of loop
中的每个不同线程调用1000个客户端所以,基本上,我想第一次更新值(of C# static field
)(当我的Windows服务启动时),并希望我的所有其他线程都应该使用{{1}设置的最新值}。
所以,我想仅更新值ONCE,然后让其他first thread
只使用该值。
有人请告诉我,我将如何实现这一目标?
提前致谢!
答案 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; }}