我想在一个单独的线程上调用重型方法dowork并在超过3秒时将其杀死。以下代码有问题吗?
class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("starting new thread");
Thread t = new Thread(new ThreadStart(dowork));
t.Start();
DateTime start = DateTime.Now;
TimeSpan span = DateTime.Now.Subtract(start);
bool wait = true;
while (wait == true)
{
if (span.Seconds > 3)
{
t.Abort();
wait = false;
}
span = DateTime.Now.Subtract(start);
}
Console.WriteLine("ending new thread after seconds = {0}", span.Seconds);
Console.WriteLine("all done");
Console.ReadLine();
}
static void dowork()
{
Console.WriteLine("doing heavy work inside hello");
Thread.Sleep(7000);
Console.WriteLine("*** finished**** doing heavy work inside hello");
}
}
答案 0 :(得分:10)
这是一个非常糟糕的编程习惯。不要启动无法干净关闭的线程。启动线程的代码和运行线程的代码应该有一些明确定义的机制,通过它们可以进行通信。有很多这样的机制;例如,工作者线程可以定期询问所有者线程“我应该继续吗?”工作线程可以定期检查线程安全字段,该字段表示是否要尽快停止。等等。
如果你正在开始新线程的工作而你不知道它正在做什么或者要花多长时间,那么你正在玩火。特别是如果该线程代码可能敌对且主动拒绝被删除。 无法保证中止一个线程做任何事情;如果你聪明,那么你可以编写代码,使线程能够抵抗线程中止。
如果您处于这种情况,正确的做法是在新的进程中启动代码,而不是新的线程,然后关闭进程需要太长时间。
答案 1 :(得分:5)
如果是我,我会使用需要一毫秒参数的Thread.Join()
重载。 (或者采用TimeSpan的那个。)它更干净,代码更少。
t.Start();
if (!t.Join(3000))
t.Abort();
或者,就像Matti所说的那样,将时序逻辑放在线程进程中并使其自毁。
答案 2 :(得分:-1)
我认为您需要了解Thread.Join(int)
。它将尝试加入一个线程,并在指定的超时后退出,然后您可以调用Thread.Abort()
。