4

foreach ステートメントがあり、 foreach の最後にメソッドが呼び出され、 if ステートメントが最後の実行時間から 3 秒後にのみ実行されるようにする必要があります。

これがコードです。

  //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 
                        }
                    }
                }
            }

また、アイテムが追加されたときに、アイテムが追加されたことをサーバーから確認する必要があるため、スリープさせたくありません。

4

2 に答える 2

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
}
于 2012-12-18T09:45:56.693 に答える
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);
                        }
                    }
                }
            }
        }
于 2012-12-18T14:26:39.603 に答える