我正在处理的项目中的许多区域都有一个简单的超时检查,它基本上通过try循环运行代码,直到成功或超过10秒。
class Timeout {
private readonly DateTime timeoutDate;
public bool FlagSuccess;
public Timeout() {
timeoutDate = DateTime.UtcNow.AddSeconds(10);
flagSuccess = false;
}
public bool continueRunning() {
if (!flagSuccess && DateTime.UtcNow < timeoutDate) return true;
else return false;
}
}
以下是正在使用的类的示例:
Timeout t = new Timeout();
while (t.continueRunning()) {
try {
//PUT CODE HERE
t.flagSuccess = true;
}
catch(Exception e) {
Console.WriteLine(e.Message);
}
}
在我实施之前,是否有更好,更标准的方法来实现这一目标?我上面所说的是基于我的盲目直觉。
答案 0 :(得分:4)
使用.NET Timer
类:
using System.Timers;
public static void Main() {
Timer t = new Timer();
t.Elapsed += new ElapsedEventHandler(ActionWhenFinished);
t.Interval = 10000;
t.Start();
}
public static void ActionWhenFinished()
{
// cancel any action
}
您的Timeout
类将阻止其运行的当前线程,而System.Timer
则不然。
答案 1 :(得分:0)
对我来说看起来像是一个忙碌的循环,但这是你用StopWatch做的。
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
timer.Start();
bool complete;
while( timer.ElapsedMilliseconds < 10000 && !complete)
{
//Do stuff
// and someday... complete = true;
}
如果你愿意的话,你可以把它包装成一个简单的类。
class AgingWait
{
System.Diagnostics.Stopwatch _watch = new System.Diagnostics.Stopwatch();
int maxMilliseconds;
bool forceExpire;
public bool Expired
{
get { return forceExpire || maxMilliseconds < _watch.ElapsedMilliseconds; }
}
public AgingWait(int milli)
{
_watch.Start();
maxMilliseconds = milli;
}
public void Expire()
{
forceExpire = true;
}
}
使用
AgingWait waiter = new AgingWait(1000);
while (!waiter.Expired)
{
if (condition)
waiter.Expire();
}
答案 2 :(得分:0)
我建议将你的循环更改为do-while循环,这样你就可以保证至少运行一次循环,即使你的线程在设置超时和启动循环之间暂时被设置。另外,我建议让Timeout类包含一个RemainingMilliseconds属性,以及可能传递给各种块或超时例程的RemainingMillisecondsUpTo(Integer N)函数可能会有所帮助。