我知道Service Fabric中的actor是单线程的。但是假设我在actor方法中启动一个新线程,那么会发生什么?即使生成的线程仍在执行,是否会停用actor?
根据documentation,演员在没有被使用时被停用'一段时间'使用'在这种情况下意味着:
IRemindable.ReceiveReminderAsync
被调用所以似乎我开始的新线程没有被考虑在内。但也许有人可以证实这一点?
答案 0 :(得分:2)
演员只是对象。
Actor将为deactivated,它可用于垃圾回收。
操作系统中的实际线程(运行时)保持running直到它们完成或终止。可以收集他们的托管表示,但这不会影响实际的线程。
此外,不会以任何方式跟踪在Actor内部生成的线程,因此您自己负责管理其生命周期。
答案 1 :(得分:1)
完全。
当你启动一个新线程时,原始线程(actor)将继续运行并超出范围,并且跨越线程继续运行。看看会发生什么:
当一个actor接收一个调用时,处理这个调用的线程将使用SemaphoreSlim获取一个锁以处理actor对象,如果另一个线程已经获得了该锁,则当前线程将等待它的释放,这样它就可以了继续一次免费。
获取锁后,线程将执行并从被调用的方法返回,并释放锁以继续跟随线程。
当您作为actor逻辑的一部分跨越一个新线程时,它将作为服务进程的一部分运行,但问题是,一旦您离开方法范围,您将无法再控制此线程,但它会继续运行,并且对于任务已完成的actor运行时,下一个actor调用将创建另一个线程,并且事情将继续进行。
问题将在以下时间开始:
在您可能(想)需要另一个线程的情况下: