Как я знаю, все операции в Akka.Net являются асинхронными, и Context.Stop()
просто посылает сообщение Stop
актеру. Это означает, что актер будет жив в течение некоторого времени, прежде чем он полностью отключится.Есть ли способ подождать, пока актер полностью остановится?
И если я позвоню Context.Child()
сразу после Context.Stop()
с именем актера, я просто остановился, я получу тот же самый актер.
Вот пример код
var actor = context.Child(actorName);
if (actor.Equals(ActorRefs.Nobody))
{
actor = CreateNewActor();
}
Context.Stop(actor)
actor = context.Child(actorName);
// what do we get here, same actor or ActorRefs.Nobody ?
Мое приложение создает актер для обработки событий от терминалов. Каждый раз, когда подключается новый терминал, я создаю нового актера, вызывая Context.Child()
с использованием имени терминала. Когда терминал отключается, я останавливаю актера.
Проблема в том, что несколько раз я получаю сообщение Connect сразу после разъединения для того же терминала, и в результате я получаю действие, которое будет остановлено. Есть ли способ проверить, что актер получил сообщение «Стоп» и скоро будет остановлен?
Вы должны прочитать о: * Жизненный цикл мониторинга ака Deathwatch * Shutdown с подтверждением: GracefulStop –
Одно из предложений, которое приходит на мой взгляд, является также [FSM] (http://getakka.net/docs/FSM).После этого актер получает сообщение Disconnect, вы переключаетесь на новое состояние и изменяете поведение. Поэтому сообщение Connect не будет обрабатываться обычным способом. И вы также можете определить, что должен делать актер, когда сообщение Connect не обрабатывается. –