C# 阻止线程的时间超过Int32.MaxValue
我正在从事一个项目,该项目需要在1秒到几个月的时间跨度内阻止一个正在运行的线程 我想到的方法是使用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
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的家伙们,如果我过度简化了。。。