приостановить поток внутри текущего потока - PullRequest
0 голосов
/ 12 января 2019

Я создаю форму, и внутри был создан метод, который я пытаюсь вызвать как другой поток, и я хочу сделать паузу на 2 секунды и начать снова. но проблема в том, что когда я добавляю thread.sleep. (1000), это замораживает мой поток формы вместо другого потока.

[STAThread]
static void Main()
{
     new Thread(() => Application.Run(new DrawForm())).Start();
}

public partial class DrawForm : Form
{
   private void CallToRun(object sender, EventArgs e)
   {
      if (menu.option == 1)
      {
          while (true)
          {
             Thread t1 = new Thread(() => MyMethod());
             t1.Start();
             Thread.Sleep(2000)//but this stop my current thread and not my MyMethod()
         }
      }
   }

  private void MyMethod()
  {
      Console.WriteLine("Runing....")
  }
}

должно быть что-то вроде этого: подножка 1 .. 2 .. подножка 1 2 подножка

1 Ответ

0 голосов
/ 12 января 2019

Здесь есть несколько проблем.

  1. Нет необходимости запускать форму в другом потоке, что может привести к непредвиденным последствиям
  2. Вы находитесь в потоке пользовательского интерфейса, вы передаете свою работу другому потоку, приостанавливаете поток в потоке пользовательского интерфейса и блокируете рассылку сообщений ... хмммм.
  3. Почему вы используете тему? Получить с тысячелетия и использовать задачи
  4. Это могут быть async и await. Однако, давайте пока отложим это

Program.cs

// lets start normally 
[STAThread]
static void Main()
{
   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);
   Application.Run(new DrawForm ());
}

Самый простой способ сделать это будет

Thread t1 = new Thread(() => 
{
    MyMethod();
    Thread.Sleep(2000); //pausing the right thread
);

Однако вы могли бы сделать это

private void CallToRun(object sender, EventArgs e)
{
   // runs concurrently
   Task.Run(
      () =>
         {
            while (true) // woah are you sure you want to run this forever?
            {
               MyMethod();

               //doesn't pause the message pump
               Thread.Sleep(2000);
            }
         });

}

Однако в современном мире мы можем использовать шаблон async и await в одной из его различных форм

Пример * +1031 ** * одна тысяча тридцать две private async Task CallToRun(object sender, EventArgs e) { while (true) // woah this stil smells { MyMethod(); await Task.Delay(2000); // not pausing the message pump, yay } }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...