2012-12-18 45 views
4

我有一個foreach語句,並且我需要使它在foreach的末尾調用一個方法,並且if語句僅在距上次執行時間3秒後執行。只有在自上次使用後的X秒後才執行方法

這是代碼。

//Go over Array for each id in allItems 
    foreach (int id in allItems) 
      { 
       if (offered > 0 && itemsAdded != (offered * 3) && tDown) 
       { 
        List<Inventory.Item> items = Trade.MyInventory.GetItemsByDefindex(id); 
        foreach (Inventory.Item item in items) 
        { 
         if (!Trade.myOfferedItems.ContainsValue(item.Id)) 
         { 
          //Code to only execute if x seconds have passed since it last executed. 
          if (Trade.AddItem(item.Id)) 
          { 
           itemsAdded++; 
           break; 
          } 
          //end code delay execution 
         } 
        } 
       } 
      } 

而我不想睡覺它,因爲當添加一個項目時,我需要從服務器獲得該項目已被添加的確認。

回答

2

簡單的時間比較怎麼樣?

var lastExecution = DateTime.Now; 

if((DateTime.Now - lastExecution).TotalSeconds >= 3) 
... 

您可以在您的Trade-Class中保存'lastExecution'。當然,如果3秒沒有過去,那麼使用此解決方案不會調用代碼塊(項目未添加)。

- // ---------------------------------

帶定時器的不同解決方案:我們以編程方式添加一個Windows窗體計時器組件。但你會在地獄的程序員結束,如果你使用此解決方案;-)

//declare the timer 
private static System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer(); 


//adds the event and event handler (=the method that will be called) 
//call this line only call once 
tmr.Tick += new EventHandler(TimerEventProcessor); 

//call the following line once (unless you want to change the time) 
tmr.Interval = 3000; //sets timer to 3000 milliseconds = 3 seconds 

//call this line every time you need a 'timeout' 
tmr.Start();   //start timer   


//called by timer 
private static void TimerEventProcessor(Object myObject, EventArgs myEventArgs) 
{ 
    Console.WriteLine("3 seconds elapsed. disabling timer"); 
    tmr.Stop(); //disable timer 
} 
+0

我需要的代碼來執行,每次,只是不就快了。如果這有道理?我必須等待服務器驗證,接受併發回確認信息。我不希望它將它們加快速度。 – Coffman34

+2

如果您只是需要等待回覆,請不要依賴時間,請[隊列](http://www.dotnetperls.com/queue)。與您的服務器通信的後臺線程發送第一個「命令」並等待,直到它接收到下一個「命令」的答案,然後從隊列發送下一個「命令」,依此類推。 (我想你是在後臺線程中這樣做的,因爲它應該與所有網絡/ i-net通信)。 – flexo

1
 DateTime? lastCallDate = null; 
     foreach (int id in allItems) 
     { 
      if (offered > 0 && itemsAdded != (offered * 3) && tDown) 
      { 
       List<Inventory.Item> items = Trade.MyInventory.GetItemsByDefindex(id); 
       foreach (Inventory.Item item in items) 
       { 
        if (!Trade.myOfferedItems.ContainsValue(item.Id)) 
        { 
         //execute if 3 seconds have passed since it last execution... 
         bool wasExecuted = false; 
         while (!wasExecuted) 
         { 
          if (lastCallDate == null || lastCallDate.Value.AddSeconds(3) < DateTime.Now) 
          { 
           lastCallDate = DateTime.Now; 
           if (Trade.AddItem(item.Id)) 
           { 
            itemsAdded++; 
            break; 
           } 
           wasExecuted = true; 
          } 
          System.Threading.Thread.Sleep(100); 
         } 
        } 
       } 
      } 
     } 
相關問題