我想在一个单独的线程上调用重型方法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");
}
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 10
这是一个非常糟糕的编程习惯.不要启动无法干净关闭的线程.启动线程的代码和运行线程的代码应该有一些明确定义的机制,通过它们可以进行通信.有很多这样的机制; 例如,工作者线程可以定期询问所有者线程"我应该继续吗?" 工作线程可以定期检查线程安全字段,该字段表示是否要尽快停止.等等.
如果你正在开始新线程的工作而你不知道它在做什么或者要花多长时间,那么你就是在玩火.特别是如果该线程代码可能是敌对的并且主动抵制被取消.有没有保证在所有中止线程做任何事情; 如果你聪明,那么你可以编写代码,使线程能够抵抗线程中止.
如果您处于这种情况,正确的做法是在新进程中启动代码,而不是新 线程,然后在花费太长时间时关闭进程.
如果是我,我会使用Thread.Join()需要一毫秒参数的重载.(或者采用TimeSpan的那个.)它更干净,代码更少.
t.Start();
if (!t.Join(3000))
t.Abort();
Run Code Online (Sandbox Code Playgroud)
或者,就像Matti所说的那样,将时序逻辑放在线程进程中并使其自毁.