C# добавляющие и удаляющие события от таймера

в соответствии с документацией момента , в основном без параметров, функция diff возвращает число в milliseconds, вы можете использовать years, months, weeks, [ 119], hours, minutes и seconds, если вы хотите использовать другую единицу времени.

принять во внимание:

По умолчанию момент # diff будет обрезать результат до нуля десятичных разрядов, возвращая целое число. Если вам нужно число с плавающей запятой, передайте true в качестве третьего аргумента.

blockquote>

проверяет рабочий фрагмент кода, который показывает другие типы блоков.

const getTimeDiff = (differenceIn = 'milliseconds', floating= false) => {
  var now = moment("04-09-2013 15:00:00", "DD-MM-YYYY HH:mm:ss");
  var then = moment("04-09-2013 14:59:40", "DD-MM-YYYY HH:mm:ss");
  //this return the difference between now and then in milliseconds as default
  var timeDifference = now.diff(then, differenceIn, floating);
  console.log("Time difference - " + timeDifference + ' ' + differenceIn);
}

getTimeDiff();
getTimeDiff('seconds');
getTimeDiff('seconds', true);
getTimeDiff('minutes');
getTimeDiff('minutes', true);
getTimeDiff('hours');
getTimeDiff('hours', true);
getTimeDiff('days');
getTimeDiff('days', true);
getTimeDiff('weeks');
getTimeDiff('weeks', true);
getTimeDiff('months');
getTimeDiff('months', true);
getTimeDiff('years');
getTimeDiff('years', true);

В своем коде убедитесь, что вы пытаетесь выполнить diff из String. В основном вы делаете format перед применением diff.

const getTimeDiffWithCurrentTime = (lastLoggedInDateTime) => {
  //***PROBLEM IS HERE IN THE BELLOW LINE WHERE THE OUTPUT IS 1547571895000***
  var momentLastLoggedInDateTime = moment(lastLoggedInDateTime, "DD-MM-YYYY HH:mm:ss");
  //var currentDateTime = moment().format("DD-MM-YYYY HH:mm:ss"); IF YOU DO THIS, you get a STRING
  var currentDateTime = moment()
  console.log(' lastLoggedInDateTime - ' + lastLoggedInDateTime + 'momentLastLoggedInDateTime - ' + momentLastLoggedInDateTime +
    ' currentDateTime - ' + currentDateTime);
  var timeDifference = currentDateTime.diff(momentLastLoggedInDateTime);
  console.log("Time difference - " + timeDifference);
  return timeDifference;
}

const newDate = new Date(new Date() - 10000); //minus 10 seconds


getTimeDiffWithCurrentTime(newDate);

9
задан TK. 16 February 2009 в 17:45
поделиться

6 ответов

Я полагаю что этот код:

myTimer.Tick -= new EventHandler(ev);

создает новый объект EventHandler. Это никогда не будет удалять существующий EventHandler. Для получения функциональности, Вы хотите, необходимо быть передающими в EventHandlers, не MyDelegates, к добавлению и удалить методы:

Timer myTimer = new Timer(); // Windows.Forms Timer

public void addEvent(EventHandler ev)
{
    myTimer.Tick += ev;
}

public void removeEvent(EventHandler ev)
{
    myTimer.Tick -= ev;
}

Код вызова должен будет отслеживать добавленный EventHandlers, так, чтобы он мог передать в том же объекте EventHandler, когда пора отказаться от подписки.

10
ответ дан 4 December 2019 в 13:05
поделиться

Первоначальный код хорошо работает, настолько же долго как MyDelegate 'ev'переданный в addEvent и removeEvent тот же экземпляр объекта (Например, если существует уровень класса MyDelegate поле, которое содержит экземпляр или если Вы следуете совету нескольких других здесь и сохраняете MyDelegate объект (объекты) в Словаре).

Я подозреваю, что проблема состоит в том что вызов кода addEvent и removeEvent передает новый MyDelegate экземпляры, указывающие на некоторый метод обработчиков, как так:

addEvent(new MyDelegate(this.HandlerMethod));
// ... do some stuff
removeEvent(new MyDelegate(this.HandlerMethod));

В этом случае addEvent и removeEvent создают EventHandler делегаты, которые указывают на различные адреса метода даже при том, что те делегаты в свою очередь указывают на тот же метод (this.HandlerMethod). Это вызвано тем, что EventHandler делегаты это add и remove точка формирования данных к MyDelegate.Invoke() метод на различном MyDelegate экземпляры, а не непосредственно к адресу this.HandlerMethod.

3
ответ дан 4 December 2019 в 13:05
поделиться

Ваша проблема возникает из наличия вспомогательных методов сделать это. Без них это работает как ожидалось, с ними это не знает, что отсоединить.

Для фиксации этого необходимо будет поддержать словарь со значением, являющимся EventHandler, созданным в методе сцепления так, чтобы можно было удалить то значение позже.

Что-то как:

var handlers = new Dictionary<MyDelegate, EventHandler>();

public void addEvent(MyDelegate ev)
{
    var handler = new EventHandler(ev);
    handlers.Add(ev, handler);
    myTimer.Tick += handler;
}

public void removeEvent(MyDelegate ev)
{
    myTimer.Tick -= handlers[ev];
}

Необходимо добавить соответствующие проверки, если элемент существует.

Вы могли также изменить свой тип параметра, и он будет работать как ожидалось.

public void addEvent(EventHandler ev)
{
    myTimer.Tick += ev;
}

public void removeEvent(EventHandler ev)
{
    myTimer.Tick -= ev;
}

addEvent(new EventHandler(...));
removeEvent(new EventHandler(...));
2
ответ дан 4 December 2019 в 13:05
поделиться

Необходимо просто смочь отказаться от подписки путем ссылки на название ровного метода обработки как так:

public void removeEvent(MyDelegate ev)
{
    myTimer.Tick -= ev as EventHandler;
}
1
ответ дан 4 December 2019 в 13:05
поделиться

При добавлении и удалении обработчиков событий Вы создаете новую обертку для своего делегата каждый раз. Таким образом в Вашем удалять метод это пытается удалить новый объект EventHandler, который никогда не добавлялся как слушатель события во-первых.

Если Вы хотите продолжать использовать этот тип установки, Вы могли бы, возможно, засунуть свой EventHandlers в Словарь. В addEvent методе засуньте свой недавно созданный EventHandler в Ваш словарь, и в removeEvent методе, вытяните EventHandler из словаря и удалите это вместо того, чтобы инстанцировать нового.

0
ответ дан 4 December 2019 в 13:05
поделиться

Я не знаю то, что Вы делаете неправильно, но обычный подход, который я использовал бы для Таймеров, должен будет подписаться на Tick событие, и затем отключает Таймер, когда Вы не хотите получать события, повторно включая, когда Вы делаете.

Может не помочь Вам, если у Вас есть больше чем один обработчик событий, сцепленный до события, но надо надеяться несколько полезный.

0
ответ дан 4 December 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: