2011-02-08 53 views
3

我正在做的一個項目中的很多領域都有一個簡單的超時檢查,它基本上通過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); 
    } 
} 

我實現了在此之前,有沒有更好的,更標準的方式來做到這一點?我上面的內容是基於我的盲目直覺。

+1

如果您的代碼是一個耗時的函數,那麼您在while語句中的檢查不會(或者至少在它所需的所有時間)被評估,並且您的計時器相當無意義。 – 2011-02-08 20:04:01

+0

沒關係。至少將超時值傳遞給構造函數。 – 2011-02-08 20:13:26

回答

4

使用.NETs Timer類(ES):

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的情況。

0

看起來像一個忙碌的循環給我,但這裏是你如何做一個秒錶。

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(); 

    } 
+0

我是在你打算讓線程被阻止的假設下。 – deepee1 2011-02-08 20:10:44

0

我建議將您的循環更改爲do-while循環,以便保證至少運行循環一次,即使您的線程在設置超時和啓動循環之間暫時停下來。另外,我建議讓Timeout類包含一個RemainingMilliseconds屬性,以及RemainingMillisecondsUpTo(Integer N)函數可能會有幫助,該函數可以傳遞給各種塊或超時例程。