Member 7912784 Ответов: 2

Как изменить значение в потоке при его запуске C#


Я хочу изменить значение enum для всех потоков в моем приложении во время выполнения вот мой код :

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 все темы, продолжайте делать как
DataWorkState.RunWork


ничего не меняется во всех потоках как я могу это исправить

Что я уже пробовал:

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();
    }
  }
}

2 Ответов

Рейтинг:
2

OriginalGriff

Хм. Ничего не произойдет: вы создадите список своего класса, но не будете заполнять его ничем. В результате список всегда пуст, и ваши циклы никогда не попадают в тело - runWorkers.Свойство Count всегда равно нулю.


Member 7912784

Хм. я испортил код, который не набирал все подряд. существует метод, который добавляет список, когда форма загружается, я уверен, что при меньшем количестве объектов в списке есть 5, прежде чем я нажму кнопку.

проблема не в списке объектов, проблема в том, что после запуска любого из состояний (напр. DataWorkState.RunWork,...) я не могу изменить его снова, даже если я приостановлю поток и возобновлю его. как будто нить выглядит в первом состоянии с которого она начинается

OriginalGriff

Не "будьте уверены" - используйте отладчик и проверьте его! А затем проверьте, что именно происходит, когда вы идете по кругу.
Мы не можем сделать это для вас - вы явно не дали нам весь код, поэтому у нас нет возможности запустить его при тех же условиях, что и вы.

Рейтинг:
10

Richard Deeming

Поле летучий[^]:

public volatile DataWorkState WorkerState;


Member 7912784

спасибо большое volatile поле нормально работает