Akka. net планировщик отправляет только первое значение и не обновляет его, как это исправить - PullRequest
0 голосов
/ 07 февраля 2020

Я не могу найти ответ на интересный момент. в akka.net у меня есть планировщик. Он будет работать в акторе, который отсортирован по числу.

здесь простая реализация

_statusScheduler = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(
            TimeSpan.FromSeconds(_shedulerInterval),
            TimeSpan.FromSeconds(_shedulerInterval),
            _reporterActor,
            new ProgressReport(requestId, _testedQuantity),
            Self);

, где

_shedulerInterval - 5-секундный интервал,

_testedQuantity - количество тестируемых номеров постоянно обновляется.

и через 5 секунд отправляется 0; всегда, не измененный номер. И вот вопрос: можно ли отправить обновленное количество?

Я не могу отправить сообщение для количества обновления из методов Recieve<>, потому что мой актер обрабатывает сообщение подсчета, и он все время подсчитывает количество и обновляет его (когда оно закончится, оно получит следующее сообщение). Но все пять секунд я должен генерировать отчет по планировщику. Можно ли это исправить?

Думаю, теперь мне нужно отправить все логи c, потому что он работает нормально, и камень моей проблемы - поведение планировщика.

1 Ответ

1 голос
/ 07 февраля 2020

Проблема, с которой вы столкнулись, заключается в том, что сообщение, которое вы передаете в планировщик, new ProgressReport(requestId, _testedQuantity), - это то, что будет отправляться каждый раз. Поскольку вы передаете эти целочисленные значения по значению, объект будет иметь исходные значения для этих полей во время создания сообщения, и поэтому сообщение никогда не будет обновляться.

Если вы хотите быть в состоянии изменить содержимое, отправляемое в повторяющемся планировщике, вместо этого сделайте следующее:

var self = Self; // need a closure here, since ActorContext won't be available
_statusScheduler = Context.System.Scheduler.Advanced.ScheduleRepeatedlyCancelable(interval, interval, () => {
  _reporterActor.Tell(new ProgressReport(requestId, _testedQuantity), self);
});

Это использование планировщика будет генерировать новое сообщение каждый раз, когда он вызывает функцию лямбда, и, таким образом, вы будете возможность включать обновленные целочисленные значения внутри вашего объекта.

...