Господа коллеги ( ), у меня проблема. Мне нужен таймер, который через заданное время проверяет определенную функцию. Но дело в том, что в эту функцию мне надо передать экземпляр этого таймера, чтобы в нужный момент выключить его. Заодно я передаю и экземпляр DateTime, чтобы каждый раз в функции не создавать новый объект.
Я переопределил EventArgs:
using System;
using System.Windows.Forms;
public class WorkingDayEventArgs: System.EventArgs
{
public DateTime dtnow;
public Timer waitForWorkingDayTimer;
public WorkingDayEventArgs(DateTime dtnow, Timer waitForWorkingDayTimer)
{
this.dtnow = dtnow;
this.waitForWorkingDayTimer = waitForWorkingDayTimer;
}
}
Добавил класс с делегатом:
using System;
using System.Windows.Forms;
public class WorkingDayEvent
{
public delegate void WorkingDayEventHandler(Object obj, WorkingDayEventArgs ea);
//вот тут вот меня большие сомнения терзаютpublic event EventHandler DayEvent;
public void WaitForWorkingDay(DateTime dtnow, Timer waitForWorkingDayTimer)
{
WorkingDayEventArgs workingDayArgs = new WorkingDayEventArgs(dtnow, waitForWorkingDayTimer);
DayEvent(this, workingDayArgs);
}
}
Структура программы получилась такова (в общих чертах):
...
бла-бла-бла, много кода
...
private void buttonStart_OnClick(object sender, System.EventArgs e)
{
WorkingDayEvent dayEvent = new WorkingDayEvent();
dayEvent.WaitForWorkingDay(dtnow, waitForWorkingDayTimer);
Timer waitForWorkingDayTimer = new Timer();
waitForWorkingDayTimer.Interval = 5000;
waitForWorkingDayTimer.Tick += new WorkingDayEvent.WorkingDayEventHandler(WaitForWorkingDayTest);
waitForWorkingDayTimer.Start();
}
//функция, которую мне надо вызывать через таймер каждые 5 сек.private void WaitForWorkingDayTest(object obj, WorkingDayEventArgs ea)
{
ea.dtnow = DateTime.Now;
if(ea.dtnow.Hour > (AutoHitKernel.iWorkingDayEndHours - 1) || ea.dtnow.Hour < (AutoHitKernel.iWorkingDayBeginHours + 1))
{
}
else
{
WorkingDay();
//а для этого я как раз и тащу экземпляр таймера.
ea.waitForWorkingDayTimer.Stop();
}
}
...
бла-бла-бла, много кода
...
Но при попытке откомпилить получаю облом:
waitForWorkingDayTimer.Tick += new WorkingDayEvent.WorkingDayEventHandler(WaitForWorkingDayTest);
// MainForm.cs(340): Cannot implicitly convert type 'AutoHitNamespace.WorkingDayEvent.WorkingDayEventHandler' to 'System.EventHandler'
Я подозреваю, что как-то не так переопределил стандартный делегат EventHandler. Как сделать это правильно?
Здравствуйте, Дмитрий Осипов, Вы писали:
ДО>Господа коллеги ( ), у меня проблема. Мне нужен таймер, который через заданное время проверяет определенную функцию. Но дело в том, что в эту функцию мне надо передать экземпляр этого таймера, чтобы в нужный момент выключить его. Заодно я передаю и экземпляр DateTime, чтобы каждый раз в функции не создавать новый объект. ДО>Я переопределил EventArgs:
ДО>Я подозреваю, что как-то не так переопределил стандартный делегат EventHandler. Как сделать это правильно?
Не надо создавать свой делегат. Испольуй EventHandler. А в метод передавай WorkingDayEventArgs.
ДО>Да я уж по всякому пробовал, и так в том числе — не помогает.
там должен быть обязательно EventHandler, Вы все таки подписываетесь на Tick, тип которого EventHandler
а в вашем хендлере уже должен быть код просто вызывающий ваш метод и передающий ему this и DateTime.Now
Здравствуйте, Lloyd, Вы писали: L>Не надо создавать свой делегат. Испольуй EventHandler. А в метод передавай WorkingDayEventArgs.
А как я буду передавать в него WorkingDayEventArgs, если стандартный делегат просит System.EventArgs? При попытке откомпилить возникает ошибка (что, в общем, логично):
MainForm.cs(342): Method 'MainForm.WaitForWorkingDayTest(object, WorkingDayEventArgs)' does not match delegate 'void System.EventHandler(object, System.EventArgs)'
Здравствуйте, Дмитрий Осипов, Вы писали:
ДО>А как я буду передавать в него WorkingDayEventArgs, если стандартный делегат просит System.EventArgs? При попытке откомпилить возникает ошибка (что, в общем, логично):
private void WaitForWorkingDayTest(object obj, EventArgs ea) {
WorkingDayEventArgs wdea = (WorkingDayEventArgs)ea;
// Далее работаешь с wdea
}
Теперь на этой строке в процессе выполнения обнаруживается ошибка "Specified cast is not valid".
private void WaitForWorkingDayTest(object obj, EventArgs ea)
{
WorkingDayEventArgs wdea = (WorkingDayEventArgs)ea; // "Specified cast is not valid"
}
Я вообще-то правильно делаю так:
private void buttonStart_OnClick(object sender, System.EventArgs e)
{
WorkingDayEvent dayEvent = new WorkingDayEvent();
dayEvent.WaitForWorkingDay(dtnow, waitForWorkingDayTimer);
Timer waitForWorkingDayTimer = new Timer();
waitForWorkingDayTimer.Interval = 5000;
waitForWorkingDayTimer.Tick += new WorkingDayEvent.WorkingDayEventHandler(WaitForWorkingDayTest);
waitForWorkingDayTimer.Start();
}
и так:
public class WorkingDayEvent
{
public event EventHandler DayEvent;
public void WaitForWorkingDay(DateTime dtnow, Timer waitForWorkingDayTimer)
{
WorkingDayEventArgs workingDayArgs = new WorkingDayEventArgs(dtnow, waitForWorkingDayTimer);
DayEvent(this, workingDayArgs);
}
}
?
Просто я не совсем понимаю, где мне передать значения DateTime и Timer в саму WorkingDayEventArgs.
Здравствуйте, Дмитрий Осипов, Вы писали:
ДО>Просто я не совсем понимаю, где мне передать значения DateTime и Timer в саму WorkingDayEventArgs.
Кажется понял что ты имеешь в виду.
Попробуй создать свой класс для обработки события Timer.Tick. В конструкторе этого класса передавай нужные тебе данные и сохряняй их в полях этого класса. И, соответственно, подписывай на событие метод этого класса.
public class WorkingDayHandler {
private DatetTime _dateTime;
public WorkingDayHandler(DatetTime dateTime) {
_dateTime = dateTime;
}
public void HandleEvent(object sender, EventArgs e) {
// Your logic here
}
}
...
WorkingDayHandler handler = new WorkingDayHandler(DateTime.Now);
Timer waitForWorkingDayTimer = new Timer();
waitForWorkingDayTimer.Interval = 5000;
waitForWorkingDayTimer.Tick += new EventHandler(handler.HandleEvent);
waitForWorkingDayTimer.Start();
Здравствуйте, Lloyd, Вы писали:
L>Кажется понял что ты имеешь в виду.
Спасибо что уделили мне время и помогли разобраться в этой ерунде. Я начал делать приблизительно так, но потом под влиянием мсдна запутался и начал воротить всякие ужасы.