C# 阻止线程的时间超过Int32.MaxValue

C# 阻止线程的时间超过Int32.MaxValue,c#,multithreading,c#-4.0,thread-synchronization,C#,Multithreading,C# 4.0,Thread Synchronization,我正在从事一个项目,该项目需要在1秒到几个月的时间跨度内阻止一个正在运行的线程 我想到的方法是使用EventWaitHandle.WaitOne方法(或其任何同级)指定超时。问题是,所有这些方法都将Int32作为参数,将最大阻塞时间限制为大约25天 有人知道这个问题的解决办法吗?如何阻止线程超过Int32.MaxValue毫秒 谢谢 更新 为了便于记录,以下是我最终得出的代码片段: while(_doRun) { // Determine the next trigger time va

我正在从事一个项目,该项目需要在1秒到几个月的时间跨度内阻止一个正在运行的线程

我想到的方法是使用
EventWaitHandle.WaitOne
方法(或其任何同级)指定超时。问题是,所有这些方法都将Int32作为参数,将最大阻塞时间限制为大约25天

有人知道这个问题的解决办法吗?如何阻止线程超过Int32.MaxValue毫秒

谢谢

更新

为了便于记录,以下是我最终得出的代码片段:

while(_doRun)
{
  // Determine the next trigger time
  var nextOccurence = DetermineNextOccurence();
  var sleepSpan = nextOccurence - DateTime.Now;

  // if the next occurence is more than Int32.MaxValue millisecs away,
  // loop to work around the limitations of EventWaitHandle.WaitOne()
  if (sleepSpan.TotalMilliseconds > Int32.MaxValue) 
  {
    var idleTime = GetReasonableIdleWaitTimeSpan();
    var iterationCount = Math.Truncate(sleepSpan.TotalMilliseconds / idleTime.TotalMilliseconds);
    for (var i = 0; i < iterationCount; i++)
    {
      // Wait for the idle timespan (or until a Set() is called).
      if(_ewh.WaitOne(idleTime)) { break; }
    }
  }
  else
  {
    // if the next occurence is in the past, trigger right away
    if (sleepSpan.TotalMilliseconds < 0) { sleepSpan = TimeSpan.FromMilliseconds(25); }

    // Wait for the sleep span (or until a Set() is called).
    if (!_ewh.WaitOne(sleepSpan))
    {
      // raise the trigger event
      RaiseTriggerEvent();
    }
  }
}
while(_doRun)
{
//确定下一个触发时间
var nextOccurence=DetermineNextOccurence();
var sleepSpan=nextOccurence-DateTime.Now;
//如果下一次发生的时间超过Int32.MaxValue毫秒,
//循环以绕过EventWaitHandle.WaitOne()的限制
if(sleepSpan.total毫秒>Int32.MaxValue)
{
var idleTime=getreasonalidlewaittimespan();
var iterationCount=Math.Truncate(sleepSpan.totalmillizes/idleTime.totalmillizes);
对于(var i=0;i
该代码段是由专用线程执行的代码。请注意,
EventWaitHandle.Set()
仅在应用程序退出或退出以取消计划程序时调用

感谢那些愿意帮助的人。

尝试
handle.WaitOne(System.Threading.Timeout.Infinite)

如果不希望它无限运行,请从其他线程外部触发等待句柄

更新:

如果不想使用其他线程,请使用循环:

bool isTriggered = false;
while (!isTriggered) {
    isTriggered = handle.WaitOne(timeout);
    //Check if time is expired and if yes, break
}

您必须将超时时间跨度分割为多个块,这些块将适合
Int32
isTriggered
变量将显示句柄是否已触发或超时。

您真的认为应用程序可以运行那么长时间吗?它肯定会在第23天的测试中崩溃听起来好像设计出了严重的问题。你应该在某个事件上开始你的线程。或者使用一个不会被浪费的计时器来获取线程。线程是工作线程,它们的工作单元是以CPU周期来度量的。你不会雇佣一个工人然后付钱让他们睡上万亿秒,所以不要雇佣一个线程然后付钱让它睡上万亿个CPU周期。线程不是设计为长时间运行的事务;使用另一种机制。@JuiceOntour是真的,但我很有信心地说,任何需要线程为int.MaxValue或更高可能被阻止的情况都可以重新设计为不需要该机制。@Sefe我没有否决投票(反正声誉点数不够)。但是你提议的工作需要一个不同的线程来了解时间的流逝。@JuiceOntour:对不起,我的咆哮。不管怎样,你确定TimeSpan不起作用吗?无论如何,如果要避免线程,请在循环中等待。见我的编辑。@Sefe。谢谢下面是Quartz.Net的工作人员大致做的(我刚刚看了一下):在循环中,他们检查等待的时间是否在可接受的范围内。如果是,则在这个确切的时间内阻止线程。如果没有,他们会将线程阻塞一段半随机时间,然后再次检查。当然,我已经用我的话解释了这一点,并且只花了有限的时间研究代码。很抱歉,来自Quartz.Net的家伙们,如果我过度简化了。。。