Я пишу простую игру, в которой используются таймеры из пространства имен system.threading
для имитации времени ожидания действий. Моя цель - запускать таймер раз в секунду в течение x секунд. Чтобы добиться этого, я добавил счетчик в обратный вызов таймера.
Проблема в том, что любой код, который я размещаю после вызова события DeliveryProgressChangedEvent
, кажется, игнорируется. Мой счетчик никогда не увеличивается, что позволяет таймеру работать вечно.
Если я вызываю событие после увеличения счетчика, все работает нормально. Просто ничего после вызова события не выполнится. Вместо того, чтобы идти по простому маршруту, который я хотел бы понять, если не решу эту проблему.
Я провел немало исследований по объекту system.threading timer, а также по событиям, но не смог найти ни одного информация, связанная с моей проблемой.
Я создал голый пример своего проекта, чтобы продемонстрировать приведенную ниже проблему.
Класс игры
class Game
{
private Timer _deliveryTimer;
private int _counter = 0;
public event EventHandler DeliveryProgressChangedEvent;
public event EventHandler DeliveryCompletedEvent;
public Game()
{
_deliveryTimer = new Timer(MakeDelivery);
}
public void StartDelivery()
{
_deliveryTimer.Change(0, 1000);
}
private void MakeDelivery(object state)
{
if (_counter == 5)
{
_deliveryTimer.Change(0, Timeout.Infinite);
DeliveryCompletedEvent?.Invoke(this, EventArgs.Empty);
}
DeliveryProgressChangedEvent?.Invoke(this, EventArgs.Empty);
++_counter;
}
}
Класс формы
public partial class Form1 : Form
{
Game _game = new Game();
public Form1()
{
InitializeComponent();
_game.DeliveryProgressChangedEvent += onDeliveryProgressChanged;
_game.DeliveryCompletedEvent += onDeliveryCompleted;
pbDelivery.Maximum = 5;
}
private void onDeliveryProgressChanged(object sender, EventArgs e)
{
if (InvokeRequired)
pbDelivery.BeginInvoke((MethodInvoker)delegate { pbDelivery.Increment(1); });
MessageBox.Show("Delivery Inprogress");
}
private void onDeliveryCompleted(object sender, EventArgs e)
{
MessageBox.Show("Delivery Completed");
}
private void button1_Click(object sender, EventArgs e)
{
_game.StartDelivery();
}
}
РЕДАКТИРОВАТЬ
Просто чтобы уточнить, что я имею в виду. Любой код, который я добавлю после DeliveryProgressChangedEvent?.Invoke(this, EventArgs.Empty);
, не будет выполнен. В моем примере ++_counter
не будет работать. Событие срабатывает, и обработчик onDeliveryProgressChanged
запускается.