方法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.");
}
}
答案 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
为真。如果在Stop
和Run
之间调用DoSomething
,则该主题实际上会立即停止。