0

方法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.");
    }

}
4

3 回答 3

0

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

于 2013-04-23T07:13:24.457 回答
0

它确实有效。如果你运行这段代码,你会发现它工作得很好:

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

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

于 2013-04-23T07:14:06.490 回答
0

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

公共类 Worker { 私有 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。如果在andStop之间被调用,线程实际上会立即停止。RunDoSomething

于 2013-04-23T07:22:00.070 回答