在多线程修改中保持字段的最新状态&;在C#中访问?
方法Stop无法修改正在另一个线程中运行的字段,为什么 这是来自MSDN的一个示例,但该字段仅由一个线程修改 下面是我的代码在多线程修改中保持字段的最新状态&;在C#中访问?,c#,multithreading,C#,Multithreading,方法Stop无法修改正在另一个线程中运行的字段,为什么 这是来自MSDN的一个示例,但该字段仅由一个线程修改 下面是我的代码 public class Worker { private volatile bool isRunning; public void Run() { ThreadPool.QueueUserWorkItem(DoSomething); } public void Stop() { thi
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.");
}
}
您应该将this.isRunning更改为仅isRunning当该字段在另一个线程中运行时,它引用内存中的当前线程 它确实有效。如果运行此代码,您将看到它工作正常:
Worker worker = new Worker();
worker.Run();
Thread.Sleep(1000);
worker.Stop();
问题是,当您计划线程执行时,它需要一些时间来执行。在我的示例中,当您跳过Thread.Sleep(1000)时,您会立即将isRunning字段设置为false,然后在线程执行时将其设置为true。这就是它从不结束的原因。将行
isRunning=true
移动到函数Run()
,如下所示:
公社工人
{
私人易变布尔正在运行
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.");
}
}
当调用函数
DoSomething
时,此更改将确保isRunning
为true。如果在Run
和DoSomething
之间调用了Stop
,线程实际上会立即停止。代码中出现了什么异常?我想修改多线程中的字段并使值保持最新。但我测试了您的代码,它完全符合您的要求。也许你可以添加一些内联注释,指出哪些地方没有达到预期效果。@ZoranCausev指出了错误所在。我同意,但你没有在问题中包含真正的问题(类的使用)。不正确。“this”指的是对象的实例。此实例可以由多个线程共享。因此,此.isRunning可以由多个线程共享(和修改)。其次,在这种情况下,添加或删除“this”不会改变任何东西,因为代码仍然引用实例中的同一字段。我想在多个线程中修改&access字段,而不仅仅是在一个线程中修改它。我不理解您的问题。在多少个线程中你想调用“Run”,在多少个线程中你想调用“Stop”,在多少个线程中你想运行“DoSomething”?我这样问是因为线程不会修改字段“isRunning”,只有方法会修改。一个线程会调用你的方法。你的建议会奏效,但我不能同意。不应允许使用Worker的“客户机”知道该类的任何内部内容。因此,使用Worker的程序员不应该知道“isRunning”设置在哪里。话虽如此,开发人员应该能够调用Run并立即停止,而无需您暂停,因为这应该很简单。延迟仅仅是为了防止工人阶级内部出现“隐藏”的竞赛状况,我从来没有说过这是一个好的解决方案。我只是指出了叫停不起作用的原因。