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

时间:2016-11-16 12:47:28

标签: c# multithreading c#-4.0 thread-synchronization

我正在开发一个需要阻止正在运行的线程的项目,其时间跨度可能会在一秒到几个月之间变化。

我提出的方法是使用指定超时的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();
    }
  }
}

该片段是由专用线程执行的代码。请注意,EventWaitHandle.Set()仅在应用程序退出或调用以取消调度程序时调用。

感谢愿意提供帮助的人。

1 个答案:

答案 0 :(得分:0)

尝试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变量将显示句柄是否被触发或是否超时。