#c# #events #timer #event-handling
#c# #Мероприятия #таймер #обработка событий
Вопрос:
У меня есть классы Machine
и Production
. Machine
класс имеет свойство, IsProducing
которое указывает, выполняется ли на компьютере производство. Production
класс EstimatedTime
для вычисления оставшегося времени производства и TimePassedSince
для вычисления времени, прошедшего с момента завершения производства.
После того, как все проверки вернут true, я запускаю производство, изменяю IsProducing = 1;
и вычисляю расчетное время, которое я передаю в качестве интервала для таймера, который я создаю.
Я хочу иметь событие, которое будет вызвано, когда таймер тикает, после чего IsProducing = 0;
регистрируется текущее время EndTime
и запускается новый таймер для вычисления TimePassedSince
.
У меня есть следующий код в Production.cs:
public delegate void EstimatedTimePassedHandler(Production production, Machine machine);
public event EstimatedTimePassedHandler ProductionStarted;
public event EstimatedTimePassedHandler ProductionCompleted;
У меня есть следующий код в Form.cs:
if (dh.StartProduction(serialNr, empName) != -1)
{
machine.IsProducing = 1;
Double secondsToGo = machine.CycleTime * production.NrOfLamallae;
TimeSpan time = TimeSpan.FromSeconds(secondsToGo);
DateTime dateTime = DateTime.Today.Add(time);
production.EstimatedTime = dateTime;
string displayTime = dateTime.ToString("hh:mm:ss");
tbResult.Text = $"The production is started and will be ready in {displayTime}.";
int milliseconds = (int)secondsToGo * 100;
Timer timer1 = new Timer { Interval = milliseconds };
timer1.Enabled = true;
timer1.Tick = new Production.EstimatedTimePassedHandler(this.EstimatedTimerTicked);
}
private void EstimatedTimerTicked(Production p, Machine m)
{
m.IsProducing = 0; //completed production, not producing anymore
Timer timer1 = new Timer();
/* here I assign the production.EndTime and production.TimePassedSince */
}
Это выдает мне следующую ошибку:
Невозможно неявно преобразовать тип ‘GUI_Designs .Производство.Оцененный timepassedhandler’ to ‘System.Обработчик событий ‘
Как я могу решить эту проблему? И какова наилучшая практика для обработки такого события с помощью таймера? И как сохранить время, прошедшее с тех пор, внутри переменной? Заранее большое спасибо!
Комментарии:
1. Хорошо, если речь идет только об обработчике: вы используете неправильную подпись для делегата обработчика. Это должно быть:
void EventHandler(object? sender, EventArgs e);
, так что в этом случаеvoid EstimatedTimerTicked(object? sender, EventArgs e)
это не принесет вам большой пользы.2. Но мне интересно: что, если ваша оценка неверна или неточна? Реальность и программное обеспечение будут довольно быстро меняться. Вскоре работающие машины будут отображаться как «готово» и наоборот…
3. @Fildor Я использовал эту подпись, но изменил ее на текущую, потому что мне нужно иметь возможность управлять процессом производства и временем окончания производства, а также запускать второй таймер для сохранения времени, прошедшего с тех пор. Как это возможно с этой подписью?
4. Это не так. С
System.Windows.Forms.Timer.Tick
Event это то, что вы получаете: sender и EventArgs .