我怎样才能唤醒C#中沉睡的线程?
在人们提出建议之前:我不使用Thread.sleep做任何事情,除了想办法解决它。我正在尝试处理其他人的未来代码,这些代码可能不是.Sleep()免费的。我很清楚同步事情是多么可怕 我接受代码块中的线程。我希望能够设置此线程的生存期限制。我通常的做法如下:我怎样才能唤醒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 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”瞬间:中止不会传播。出于某种原因,我一直认为线程的作用域取决于它们的起始位置,但现在我明白了为什么不能这样。谢谢你的回复!