我使用多线程技术非常缺乏经验,但这是我尝试过的:
Thread thread = null;
for (int minute = 0; minute < 60; minute++)
{
Thread.Sleep(60000);
if (thread != null)
{
while (thread.ThreadState == ThreadState.Running) { }
}
thread = new Thread(delegate()
{
// Do stuff during the next minute whilst the main thread is sleeping.
});
thread.Start();
}
我在这里想要实现的是在主线程休眠时让线程运行并正在工作,但我不确定为什么上面的代码不起作用。发生的事情是在第一个循环之后(在启动线程之后),ThreadState似乎没有从“正在运行”改变。我也很好奇是否有更优雅的方式来做这件事。
任何人都知道这个问题吗?
答案 0 :(得分:4)
Thread.Join是等待线程结束的更好方法。
答案 1 :(得分:2)
如果您使用的是.Net 4,我建议您查看Task Class。它使得多线程处理变得更容易/更直接。
答案 2 :(得分:1)
使用Task
课程,您可以执行此操作。
Task task = Task.Factory.StartNew(() =>
{
// Do stuff here.
});
task.Wait();
答案 3 :(得分:0)
Thread.Sleep(60000)在调用它的线程上执行,在本例中是主线程。这很好,但“线程”不知道它运行了多长时间,也不知道何时实际停止。你需要让一个对象告诉“线程”它已经运行了60秒。
Thread thread = null;
for (int minute = 0; minute < 60; minute++)
{
if (thread != null)
{
while (thread.ThreadState == ThreadState.Running) { }
}
thread = new Thread(delegate()
{
try
{
// Do stuff during the next minute whilst the main thread is sleeping.
}
catch (ThreadAbortException ex)
{
}
});
thread.Start();
Thread.Sleep(60000);
thread.Abort();
}
这应该达到你想要的效果,但实际上并不是停止线程的最优雅方式。应该使用回调来结束线程。
答案 4 :(得分:0)
你可能正在寻找的是更像这样的东西:
Thread thread = new Thread(delegate()
{
// Something that takes up to an hour
});
thread.Start();
for (int minute = 0; minute < 60; minute++)
{
Thread.Sleep(60000);
if (thread.IsAlive)
Console.WriteLine("Still going after {0} minute(s).", minute);
else
break; // Finished early!
}
// Check if it's still running
if (thread.IsAlive)
{
Console.WriteLine("Didn't finish after an hour, something may have screwed up!");
thread.Abort();
}
如果您正在寻找这个,我会看一下BackgroundWorker课程。