我创建了一个表单,并在内部创建了一个方法,我尝试作为另一个线程进行调用,我想暂停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 正在运行
答案 0 :(得分:5)
这里有几个问题。
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
模式
示例
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
}
}