启动时设置线程生存期

use*_*012 6 c# lifecycle multithreading

有没有办法设置一个值,当你启动线程时线程应该(最大)存活多长时间?

用另一种方式说,用"伪代码",有这样的东西:

Thread t = new Thread();
t.start();
t.abort_after_x_seconds(30);
Run Code Online (Sandbox Code Playgroud)

如果它超过30秒,它会使线程中止.

编辑:我仍然无法让它工作,我原来的是:

while(true)
{
    if(...)
    {
        Thread t = new Thread(new ThreadStart(startMethod));
        t.start();
    }
    Thread.sleep(...);
}
Run Code Online (Sandbox Code Playgroud)

问题是有时候线程会挂起(我没有实现线程所做的事情,所以我不确切知道为什么(这是一个学校项目,我们组织起来的蠢货)),所以我想要杀死那些线程.我尝试使用Tasks和CancellationTokens,如下面的示例所示,但当任务挂起时,它无法检查是否发生了取消请求.

svi*_*ick 7

  1. 大多数时候,你不应该使用Threads,Task而是使用s代替.它们更方便,更有效.
  2. 中止某些事情并不安全,您应该使用合作取消.如果您正在调用支持取消的方法,那么只需传递一个取消令牌,该令牌将在30秒后被取消.

所以你的代码看起来像这样(使用.Net 4.5):

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30)));
var task = Task.Run(() => YourMethod(cts.Token), cts.Token);
Run Code Online (Sandbox Code Playgroud)


Ahm*_*yas 0

正如评论者所说,使用Abort是不好的做法,并且不能保证立即中止。为什么要让线程保持活动状态?当分配给它的任务完成时,该线程将被释放回池中。下次在线程上运行任务时,将通过创建另一个新线程或重新使用线程池中可用的线程来自动从线程池中分配该任务。

听起来你的逻辑/代码很糟糕,需要修复,而不是等待某件事 x 秒然后终止它,这本身就会导致连锁问题。

也许您需要一个计时器,它可以在 30 秒后计时,然后您可以禁用计时器并终止手头的任务。