Из javadoc для Executors.newCachedThreadPool()
:
Нити, которые не использовались в течение шестидесяти секунд, завершаются и удаляются из кеша.
Обычно рекомендуется называть
shutdown()
наExecutorService
, если вы знаете, что никакие новые задачи не будут отправлены на него. Затем все задачи в очереди будут завершены, но служба немедленно отключится.(Альтернативно, если вам все равно, все ли завершены задачи, например, если они обрабатывают фоновые вычисления, которые не имеют значения, как только ваш основной интерфейс исчезнет - тогда вы можете создать
ThreadFactory
, который устанавливает все потоки в этом пуле, чтобы быть демоном.)
branchUserActor.Tell(UserBeingOnline.Create(userId, branchId));
var expectedChildActor = Sys.ActorSelection($"{actorPath}/user_{userId.AkkaPrepare()}")
.ResolveOne(TimeSpan.FromSeconds(1)).Result;
Проблема заключается в том, что когда вы говорите UserBeingOnline
, вы запускаете асинхронное действие - сообщение отправлено на branchUserActor
, но оно, возможно, не было обработано сразу. Тем временем вы вызываете решение one, которое сообщает системе actor, чтобы найти дочерний элемент branchUserActor
- дочерний элемент, которого еще нет, поскольку родитель еще не обрабатывал сообщение.
Вы можете использовать метод AwaitAssert (() => Assert.IsNotNull (ResolveChild ())) для работы с этим.