2014-02-12 161 views
0

我想要創建一個方法,它將返回一個可以每毫秒調用一次的委託,但是我想限制它在每次調用時都運行緩慢的操作, 5秒內至少說一次。只能每X秒運行一次內部代碼的代理

試圖用Timer和Stopwatch實現,但不能堅持經濟實惠的解決方案。

1的方法:

public Func<bool> GetCancelRequestedFunc(string _taskName) 
{ 
    var checkStatus = false; 
    var timer = new Timer(5000); 
    timer.Elapsed += (sender, args) => { checkStatus = true; }; 

    return() => 
    { 
     if (checkStatus) 
     { 
      bool result; 
      checkStatus = false; 

      //long operation here 

      return result; 
     } 

     return false; 
    }; 
} 

1的方法似乎更對我然而它不工作 - 長運在這裏永遠不會調用,我無法找出原因。可能是需要通過checkStatusref,但不知道如何使它在這種情況下

第二個辦法:

public Func<bool> GetCancelRequestedFunc(string _taskName) 
{ 
    Stopwatch stopwatch = new Stopwatch(); 
    stopwatch.Start(); 

    return() => 
    { 
     var mod = stopwatch.ElapsedMilliseconds % 5000;  
     if (mod > 0 && mod < 1000) 
     { 
      bool result; 

      //long operation here 

      return result; 
     } 

     return false; 
    }; 
} 

這一個工程......但非常不可靠的,因爲它似乎在6日執行的檢查第二,如果委託調用。但是它會在第6秒鐘內一直被調用。

你能說第一種方法有什麼問題,或者可能會提示更好的方法嗎?

回答

1

你並不真正需要的任何計時器在這裏,只記得那個時候你最後執行的功能:

public Func<bool> GetCancelRequestedFunc(string taskName) 
{ 
    DateTime lastExecution = DateTime.Now; 

    return() => 
    { 
     if(lastExecution.AddMinutes(5)<DateTime.Now) 
     { 
      lastExecution = DateTime.Now; 
      bool result; 

      //long operation here 

      return result; 
     } 

     return false; 
    }; 
} 
+0

這完美的作品,謝謝。 – Vladimirs