【问题标题】:Can a ThreadAbortException be raised during Thread.Sleep?可以在 Thread.Sleep 期间引发 ThreadAbortException 吗?
【发布时间】:2011-01-23 03:42:47
【问题描述】:

Thread.Abort 可以中断正在休眠的线程(例如,使用 Thread.Sleep(TimeSpan.FromDays(40)) 吗?还是会等到休眠时间跨度到期?

(备注:FromDays(40) 当然是个玩笑。而且我知道 Thread.Abort 不是停止线程的推荐方法,我正在使用我现在不想重构的遗留代码。 )

【问题讨论】:

    标签: c# multithreading sleep abort


    【解决方案1】:

    您只能从另一个线程中止线程。也就是说,您应该将 Thread 引用存储在某处,然后从其他线程调用 .Abort

    【讨论】:

    • 当然。这就是它的工作原理。但是其他线程能否在睡眠时间跨度结束之前中断睡眠线程?
    • 没有什么能阻止您致电Thread.CurrentThread.Abort()
    • @Brian Rasmussen:不是在我睡觉的时候 ;-)
    • @fred-hh:当然没有,但我阅读了 Kerido 的回复,因为您只能从另一个线程中止一个线程,这是不正确的。但是,它确实说“线程”,所以我弄错了。
    • @Brian Rasmussen:“您只能从另一个线程中止线程”——这确实是错误的。这就是我一直使用它的方式。
    【解决方案2】:

    代码值一千字:

    public static void Main(string[] args)
    {
        var sleepy = new Thread(() => Thread.Sleep(20000));
    
        sleepy.Start();
        Thread.Sleep(100);
        sleepy.Abort();
        sleepy.Join();
    }
    

    程序在睡眠时间用完之前结束。

    【讨论】:

    • 我会试试的,因为经验值一千个领主;-) 如果它像宣传的那样成功,我会接受你的回答。
    • 但是如果Sleep(TimeSpan.FromDays(40)) 会发生什么?它是否在程序结束之前停止,这是关于的问题
    • @zabulus,阅读问题的备注。 TimeSpan.FromDays(40) 只是说明线程将处于休眠状态。哦,顺便说一下,用TimeSpan.FromDays(40) 调用Thread.Sleep 会导致ArgumentOutOfRangeException
    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    相关资源
    最近更新 更多