Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多线程修改中保持字段的最新状态&;在C#中访问?_C#_Multithreading - Fatal编程技术网

在多线程修改中保持字段的最新状态&;在C#中访问?

在多线程修改中保持字段的最新状态&;在C#中访问?,c#,multithreading,C#,Multithreading,方法Stop无法修改正在另一个线程中运行的字段,为什么 这是来自MSDN的一个示例,但该字段仅由一个线程修改 下面是我的代码 public class Worker { private volatile bool isRunning; public void Run() { ThreadPool.QueueUserWorkItem(DoSomething); } public void Stop() { thi

方法Stop无法修改正在另一个线程中运行的字段,为什么

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

下面是我的代码

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并立即停止,而无需您暂停,因为这应该很简单。延迟仅仅是为了防止工人阶级内部出现“隐藏”的竞赛状况,我从来没有说过这是一个好的解决方案。我只是指出了叫停不起作用的原因。