在人们建议之前: 我不使用thread.sleep 任何事物 除了试图找到一种解决方法的方法。我正在尝试处理别人的未来代码,这可能不是免费的。我对同步事物有多么恐怖有很好的了解。

我在代码的一部分中接受线程。我希望能够为该线程的寿命设置限制。我通常这样做的方法是这样的:

Thread outer = new Thread(() =>
{
    externalThread.Start();
    externalThread.Join();
});
outer.Start();
outer.Join(lifetime);
if (outer.ThreadState != ThreadState.Stopped)
{
    outer.Abort();
}
inner.Join();

从那以后,我发现在睡眠结束之前,我显然无法唤醒睡眠线。更糟糕的是,如果我给它一生的10毫秒:

new Thread(() => { Thread.Sleep(2000); Console.WriteLine("second"); })

尽管我意识到.abort()并不是线程执行的硬限制。似乎2秒就足够了警告,但我想不...

我已经尝试检查Waitsleepjoin状态和.intrupp();它崩溃了线程或抛出异常(对不起,不确定哪个。窗口告诉我,如果没有调试器的运行,它崩溃了,如果它运行,则它的运行方式像未打电话一样运行),并且在2秒后仍将其写入控制台。 .resume()显然对睡眠线没有任何作用。

有办法唤醒线程,而没有等待睡眠到期?我知道停止不是“直接的”,因此可以称为Writeline。这是2秒的等待,让我感到困惑。如果要等待10天怎么办?由于我无法控制进来的线程,所以我无法知道,似乎没有办法 预防 这样的事情...

有帮助吗?

解决方案

没有,没有办法从睡眠中唤醒线程。您只能通过调用中断或中断(两者都抛出ThreadAbortException)来中止线程。

但是要解决您为什么运行时的问题:

new Thread(() => { Thread.Sleep(2000); Console.WriteLine("second"); })

在10ms超时仍打印出来,这是因为您用于控制线程寿命的代码无法完成您想做的事情。

因此,您有外部线程和外部。您启动外部(启动一个新线程,我们称其为线程1),然后从外部线程开始(启动一个新线程,将其称为线程2)。因此,您刚刚开始了两个新线程。

你打电话时 outer.About(), ,仅中止线程1.线程通过调用开始 externalThread.Start(), ,线程2继续执行完成,因为没有任何内容。

我不确定您要使用额外的外线要完成什么。这不是很简单:

externalThread.Start();
externalThread.Join(lifetime);
if (externalThread.ThreadState != ThreadState.Stopped)
{
    externalThread.Abort();
}

其他提示

使用Waitone +计时器控制未知来源的线程。

或者,如果您可以控制线程的工作代码:

Kinda Hacky方法,在不喜欢用于唤醒线程的时间/其他线程时,获得更多的“响应式睡眠”

用它代替普通线程。

    private void WaitFor(int milis)
    {
        const int interval = 500;

        if (milis <= interval)
        {
            throw new ArgumentException();
        }

        var sections = milis / interval;
        for (var s = 0; s < sections && (!ShouldQuit); ++s)
        {
            Thread.Sleep(interval);
        }
    }

请注意,应该是从两个线程访问的集体字段

当然,这比基于事件/计时器等待的CPU使用特性更差

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top