在C#中的多线程修改和访问中保持最新的字段?

时间:2013-04-23 06:55:16

标签: c# multithreading

方法Stop无法在另一个线程中修改字段isRunning,为什么?

以下是来自MSDN的示例,但该字段仅由一个线程修改。

http://msdn.microsoft.com/en-us/library/x13ttww7(v=vs.110).aspx

以下是我的代码。

public class Worker
{
    private volatile bool isRunning;

    public void Run()
    {
        ThreadPool.QueueUserWorkItem(DoSomething);
    }

    public void Stop()
    {
        this.isRunning = false;
    }

    private void DoSomething(object state)
    {
        this.isRunning = true;
        while (this.isRunning)
        {
            Console.WriteLine("working...");
            Thread.Sleep(1000);
        }

        Console.WriteLine("stopped.");
    }

}

3 个答案:

答案 0 :(得分:0)

您应该将this.isRunning更改为仅isRunning这是指字段在另一个线程中运行时内存中的当前线程。

答案 1 :(得分:0)

它确实有效。如果您运行此代码,您将看到它正常工作:

Worker worker = new Worker();
worker.Run();
Thread.Sleep(1000);
worker.Stop();

问题在于,当您计划执行某个线程时,需要一些时间来执行。在我的示例中跳过Thread.Sleep(1000)的情况下,立即将isRunning字段设置为false,然后在执行线程时将其设置为true。这就是它永远不会结束的原因。

答案 2 :(得分:0)

将您的第isRunning = true行移至函数Run(),如下所示:

公共类工作者 {     private volatile bool isRunning;

public void Run()
{
    this.isRunning = true;
    ThreadPool.QueueUserWorkItem(DoSomething);
}

public void Stop()
{
    this.isRunning = false;
}

private void DoSomething(object state)
{
    while (this.isRunning)
    {
        Console.WriteLine("working...");
        Thread.Sleep(1000);
    }

    Console.WriteLine("stopped.");
}

}

当调用函数isRunning时,此更改将确保DoSomething为真。如果在StopRun之间调用DoSomething,则该主题实际上会立即停止。