如何在运行C#时更改线程中的值 [英] How do change value in thread when it run C#

查看:318
本文介绍了如何在运行C#时更改线程中的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在运行时将枚举值更改为我的应用中的所有线程这里是我的代码:



I want to change enum value to all threads in my app at run time here is my code :

public class UsingData
{
  //do staff
  public enum DataWorkState
  {
    RunWork,
    StopWork,
    Break,
    None
  }
}

public class Worker
{
  //do Staff
  public Thread RunWorker;
  
  public DataWorkState WorkerState;

  public Worker()
  {
    RunWorker = new Thread(StartWork);
    WorkerState = DataWorkState.None;
  }

  Privet void StartWork()
  {
    lock(RunWorker)
    {
      while(WorkerState == DataWorkState.RunWork)
      {
        //do staff
      }
      while(WorkerState == DataWorkState.StopWork)
      {
        //do staff
      }
      while(WorkerState == DataWorkState.Break)
      {
        //do staff
      }
    }
  }
}

public class form1:Form
{
  List<Worker> runWorkers;

  public form1()
  {
    ......
    runWorkers = new List<Worker>();
  }

  privet void btonRunWork_Click(object sender,EventArgs e)
  {
    for(int i = 0; i < runWorkers.Count; i++)
    {
      runWorkers[i].WorkerState = DataWorkState.RunWork;
      if(!RunWorker.IsAlive)
        runWorkers[i].RunWorker.Start();
    }
  }

  privet void btonBreak_Click(object sender,EventArgs e)
  {
    for(int i = 0; i < runWorkers.Count; i++)
    {
      runWorkers[i].WorkerState = DataWorkState.Break;
      if(!RunWorker.IsAlive)
        runWorkers[i].RunWorker.Start();
    }
  }
}





现在单击RunWork所有主题后点击Break按钮继续做



now when i click Break button after i click RunWork all Threads keep do as

DataWorkState.RunWork





所有线程都没有变化我怎么能修好这个



我尝试过的事情:





nothing change in all the threads how i can fix this

What I have tried:

public class UsingData
{
  //do staff
  public enum DataWorkState
  {
    RunWork,
    StopWork,
    Break,
    None
  }
}

public class Worker
{
  //do Staff
  public Thread RunWorker;
  
  public DataWorkState WorkerState;

  public Worker()
  {
    RunWorker = new Thread(StartWork);
    WorkerState = DataWorkState.None;
  }

  Privet void StartWork()
  {
    lock(RunWorker)
    {
      while(WorkerState == DataWorkState.RunWork)
      {
        //do staff
      }
      while(WorkerState == DataWorkState.StopWork)
      {
        //do staff
      }
      while(WorkerState == DataWorkState.Break)
      {
        //do staff
      }
    }
  }
}

public class form1:Form
{
  List<Worker> runWorkers;

  public form1()
  {
    ......
    runWorkers = new List<Worker>();
  }

  privet void btonRunWork_Click(object sender,EventArgs e)
  {
    for(int i = 0; i < runWorkers.Count; i++)
    {
      runWorkers[i].WorkerState = DataWorkState.RunWork;
      if(!RunWorker.IsAlive)
        runWorkers[i].RunWorker.Start();
    }
  }

  privet void btonBreak_Click(object sender,EventArgs e)
  {
    for(int i = 0; i < runWorkers.Count; i++)
    {
      runWorkers[i].WorkerState = DataWorkState.Break;
      if(!RunWorker.IsAlive)
        runWorkers[i].RunWorker.Start();
    }
  }
}

推荐答案

嗯。什么都不会发生:你创建了一个类的列表,但是你没有用任何东西填充它。因此,列表始终为空,并且您的循环永远不会进入正文 - runWorkers.Count属性始终为零。
Um. Nothing will happen: you create a list of your class, but you don't populate it with anything. As a result the list is always empty, and your loops never enter the body - the runWorkers.Count property is always zero.


将字段标记为易变 [ ^ ]:

Mark the field as volatile[^]:
public volatile DataWorkState WorkerState;


这篇关于如何在运行C#时更改线程中的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆