Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能唤醒C#中沉睡的线程?_C#_.net_Sleep_Thread Abort - Fatal编程技术网

我怎样才能唤醒C#中沉睡的线程?

我怎样才能唤醒C#中沉睡的线程?,c#,.net,sleep,thread-abort,C#,.net,Sleep,Thread Abort,在人们提出建议之前:我不使用Thread.sleep做任何事情,除了想办法解决它。我正在尝试处理其他人的未来代码,这些代码可能不是.Sleep()免费的。我很清楚同步事情是多么可怕 我接受代码块中的线程。我希望能够设置此线程的生存期限制。我通常的做法如下: Thread outer = new Thread(() => { externalThread.Start(); externalThread.Join(); }); outer.Start(); outer.Join

在人们提出建议之前:我不使用Thread.sleep做任何事情,除了想办法解决它。我正在尝试处理其他人的未来代码,这些代码可能不是.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状态,以及.Interrupt();它会使线程崩溃,或引发异常(抱歉,不确定是哪个异常。Windows告诉我,如果没有调试程序运行,它会崩溃,如果它正在运行,它会像未调用中断一样运行),并且在2秒钟后仍会写入控制台。Resume()显然对休眠线程没有任何作用


有没有一种方法可以唤醒线程,而不用等待其睡眠到期?我知道停止不是“立即”的,所以不管怎样都可以调用Console.WriteLine;让我烦恼的是2秒钟的等待。如果要等10天呢?由于我无法控制传入的线程,我无法知道,而且似乎也无法阻止这样的事情……

不,无法将线程从睡眠中唤醒。您只能通过调用Abort或Interrupt(两者都会引发ThreadAbortException)来中止线程

但为了解决您在跑步时为什么要这样做的问题:

new Thread(() => { Thread.Sleep(2000); Console.WriteLine("second"); })
如果仍然打印10毫秒超时,这是因为控制线程生存时间的代码没有执行您想要执行的操作

所以你有外螺纹和外螺纹。您可以启动outer(启动一个新线程,让我们称之为thread1)和outer(启动一个新线程,让我们称之为thread2)。因此,您刚刚启动了两个新线程

调用
outer.About()
时,只中止线程1。线程通过调用
externalThread.Start()
启动,线程2继续执行到完成,因为没有任何操作中止它

我不确定你用额外的外螺纹想要达到什么目的。这不是更简单吗:

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

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

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

有点老套,当不喜欢定时器/其他用来唤醒线程的线程时,实现更“响应性睡眠”

用它代替普通的线。睡觉

    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);
        }
    }
private void WaitFor(整数milis)
{
常数int间隔=500;

if(milis)如何引用其他人的线程?void myFunc(线程外部线程){//近似上述代码}如果需要10天的等待,请告诉你的主管,这样做的开发人员就可以被解雇。不要试图掩盖不称职开发人员的所有可能的愚蠢行为。我真的无法从这个问题中看出你想要实现什么。这是某种任务管理器吗?请提供更多详细信息。@chibacity:这是一个长任务的一半,运行一大块代码,这样我就可以启动ajax事件并轮询它们的进度。这是一个总体管理器代码。如果我没有产生一堆线程的话,它会发生;我需要一种程序化的方式来阻止它们。通过这一点,以及一些实验,我有一个“duh”瞬间:中止不会传播。出于某种原因,我一直认为线程的作用域取决于它们的起始位置,但现在我明白了为什么不能这样。谢谢你的回复!