C# 更改另一个线程中使用的实例变量
我有一个使用.NET for Windows Azure的Web服务。在那里我有一个单例类,它有一个方法在while(true)循环中做一些事情。此方法使用singleton中的实例变量。我在一个新线程中开始无限循环。 当我更改实例变量的值(使用我的webservice)时,该值会更改。但是在infinty循环的线程中使用了旧值。 代码如下所示: 独生子女班C# 更改另一个线程中使用的实例变量,c#,multithreading,azure,azure-web-roles,C#,Multithreading,Azure,Azure Web Roles,我有一个使用.NET for Windows Azure的Web服务。在那里我有一个单例类,它有一个方法在while(true)循环中做一些事情。此方法使用singleton中的实例变量。我在一个新线程中开始无限循环。 当我更改实例变量的值(使用我的webservice)时,该值会更改。但是在infinty循环的线程中使用了旧值。 代码如下所示: 独生子女班 public class Singleton { static Singleton _instance; public
public class Singleton
{
static Singleton _instance;
public static Singleton Instance
{
get { return _instance ?? (_instance = new Singleton()); }
}
private Singleton() {
this.Intervall = -20;
}
public int Intervall { get; set; }
public void run()
{
Thread thread = new Thread(privateRun);
thread.Start();
}
private void privateRun()
{
while (true)
{
// do something with Intervall Value
Trace.WriteLine(this.Intervall);
}
}
}
在WebRole onstart()中启动run方法
并更改WebService中的值
public string setIntervall(int Intervall)
{
Singleton.Instance.Intervall = Intervall;
return "New Intervall: " + Singleton.Instance.Intervall;
}
Web服务返回真正的新间隔。但是在while循环中使用旧值。那么,如何更改所创建线程中的值呢?问题在于,默认情况下,编译器/运行时会进行大量涉及缓存值的优化。这在线程化环境中成为一个问题,因为每个线程都有自己的缓存,所以它们不会变异相同的变量,即使它们认为是 有几种解决办法 第一种是使用
volatile
:
private volatile int _interval;
public int Interval
{
get
{
return _interval;
}
set
{
_interval = value;
}
}
volatile
是一种说法,“这可以从多个线程访问,请确保修改时缓存同步
另一种方法是在访问变量时引入内存障碍。
lock
语句隐式地实现了这一点,但由于这个特定程序的整个要点似乎都是无锁编程,因此这并不可取;volatile更适合您的特殊需要。问题在于,默认情况下,编译器/运行时o大量涉及缓存值的优化。这在线程化环境中成为一个问题,因为每个线程都有自己的缓存,所以它们不会改变相同的变量,即使它们认为是
有几种解决办法
第一种是使用volatile
:
private volatile int _interval;
public int Interval
{
get
{
return _interval;
}
set
{
_interval = value;
}
}
volatile
是一种说法,“这可以从多个线程访问,请确保修改时缓存同步
另一种方法是在访问变量时引入内存屏障。
lock
语句隐式地实现了这一点,但由于这个特定程序的整个要点似乎都是无锁编程,因此这并不可取;volatile更适合您的特殊需要。您确定两个线程都在同一个应用程序域中运行吗?您确定两个线程都在同一个应用程序域中运行吗?我通过线程中的同一“错误”将其编辑到我的代码中,更改后使用旧值我通过线程中的同一“错误”将其编辑到我的代码中,更改此值后将使用旧值