2012-03-06 93 views
6

我在VS 2010中使用C#.Net4.0。 如何重新启动Thread如何在C#.Net 4.0中重新启动线程?

它就像我想Abort()的线程和Start()它从一开始呢? 这可能吗?

+1

一般来说,'Abort()'线程是一个坏主意。你想解决什么问题? – Heinzi 2012-03-06 10:23:49

+0

这可以帮助你: - [重新启动在C#4.0中的线索] [1] [1]:http://stackoverflow.com/questions/1054889/restarting-a-thread-in-net- using-c – Misam 2012-03-06 10:25:00

+0

停止和启动线程的要求有点不寻常 - 您尝试解决什么问题? – dice 2012-03-06 10:35:43

回答

7

创建线程的新实例并再次执行。 thread1 = new Thread(); thread1.start();

7

中止一个线程往往是一个坏主意。他是一名顾问。如果它是一个无限循环,则用于在没有堕胎的情况下停止线程的布尔值。

bool run = true; 
Thread thread = new Thread(method); 
thread.start(); 

private void method() 
{ 
    while(run) 
    { 

    } 
} 

停止线程,只需设置布尔为false,通常情况下,你可以重新启动它。

+1

很好的建议。 'run'应该是'volatile',以避免由于编译器优化造成的无限期等待。 – Tudor 2012-03-06 10:34:25

+1

考虑使用'lock',特别是在设置布尔值时。更好的是,将它与'monitor'结合使用。看看这里:http://stackoverflow.com/questions/1559293/c-sharp-monitor-wait-pulse-pulseall#1559662 – 2012-03-06 10:44:43

+0

当我点击创建服务器时,我的线程函数开始。它执行一些初始化,然后进入包含socket.Accept()的无限循环。控制卡在这个语句,所以我不能使用这种锁定方法。 – Shashwat 2012-03-06 12:57:00

2

Thread.Abort不保证线程会终止。例如,如果您有一个长时间运行的查询,则Abort不会终止查询的执行或取消该线程。事实上,线程将一直持续到查询完成。

如果您在托管代码中执行所有操作并且未被非托管资源锁定,并且必须中止一个线程,那么thread.Abort()就完全正确。

但是,您不能在已终止的线程上调用Start。您必须创建另一个线程并在该线程上调用Start。在.NET中(与其他语言相比),创建线程有点昂贵,内存明智,所以存在一些缺点。

+0

实际上一次又一次地创建线程不会太昂贵,因为它不会非常频繁地完成。 – Shashwat 2012-03-06 12:58:52

1

当您想要从头开始重新启动线程时,您实际上想要重新启动线程上的某个函数(代码流)的执行。当你创建一个线程并传递一个执行函数时,一旦函数完成它自己的执行,线程的生命就会终止。你只需要改变你的代码设计,这将允许重新启动一个新的线程重新启动函数。 但是对于简短的功能,我建议使用ThreadPool

1

由于您正在使用.NET 4.0,其中MS引入了“合作取消框架”。你可以从这个blog了解更多。 直接处理线程是(越来越不鼓励)。