C# 更改另一个线程中使用的实例变量

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

我有一个使用.NET for Windows Azure的Web服务。在那里我有一个单例类,它有一个方法在while(true)循环中做一些事情。此方法使用singleton中的实例变量。我在一个新线程中开始无限循环。 当我更改实例变量的值(使用我的webservice)时,该值会更改。但是在infinty循环的线程中使用了旧值。 代码如下所示:

独生子女班

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更适合您的特殊需要。

您确定两个线程都在同一个应用程序域中运行吗?您确定两个线程都在同一个应用程序域中运行吗?我通过线程中的同一“错误”将其编辑到我的代码中,更改后使用旧值我通过线程中的同一“错误”将其编辑到我的代码中,更改此值后将使用旧值