在当前线程内暂停线程

时间:2019-01-12 01:29:57

标签: c# c#-4.0

我创建了一个表单,并在内部创建了一个方法,我尝试作为另一个线程进行调用,我想暂停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 :(得分:5)

这里有几个问题。

  1. 不需要在另一个线程中启动表单,并且可能会有意想不到的事情
  2. 您正在使用UI线程,将工作交给另一个线程,并且正在暂停UI线程并阻止消息泵... hrmm。
  3. 您为什么使用Thread?迎接千年并使用Tasks
  4. 这可能是asyncawait。但是,暂时将其搁置

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

}

但是,在现代世界中,我们可能以各种形式之一使用asyncawait模式

示例

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
   }
}