对我的超时课程的反馈感兴趣

时间:2011-02-08 19:54:24

标签: c# class timer timeout

我正在处理的项目中的许多区域都有一个简单的超时检查,它基本上通过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);
    }
}

在我实施之前,是否有更好,更标准的方法来实现这一目标?我上面所说的是基于我的盲目直觉。

3 个答案:

答案 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)函数可能会有所帮助。