c# – Custom TaskScheduler,SynchronizationContext?
async等待演员内部的支持
我将演员lib Akka移植到.NET(https://github.com/rogeralsing/Pigeon) 这给了我一些问题,因为如果我使用默认调度程序,await continuation将运行与actor并发boundarys相关. 如果我能以某种方式将任务安排到演员自己的邮箱,并在邮箱运行中完成任务,这将解决问题. public class SomeActor : UntypedActor { protected override OnReceive(object message) { if (message is SomeMessage) { DoAsyncStuff(); } } private async void DoAsyncStuff() { var res = await something.. //this code will not respect the actor concurrency boundary //since it can run at the same time as OnReceive Console.WriteLine(res); } } 我确实有一个actor的线程静态上下文,所以当actor执行时,这个上下文被设置. public class ActorTaskScheduler : TaskScheduler { protected override void QueueTask(Task task) { var self = ActorCell.Current.Self; self.Tell(new ActorTask(task),ActorRef.NoSender); } 并且ActorTask消息可以由actor的系统消息处理程序处理. 我只是不知道接下来该做什么. 这是否可以仅针对特定操作应用自定义任务调度程序? 解决方法
“设置”当前调度程序的正确方法是将委托排队到所需的调度程序.当委托执行时,它将该调度程序作为“当前”.
是否有可能以另一种方式做到这一点?因为那时你有一个更简单的解决方案. 我想你可以在ConcurrentExclusiveSchedulerPair.ExclusiveScheduler中运行每个actor.这意味着任何actor代码都在线程池线程上运行;它可以是任何线程池线程,但ExclusiveScheduler将确保一次只运行一部分actor代码. 这会将演员抽象从线程“提升”到任务,这是我建议的方法,如果你能做到的话.当你有异步演员时,它减轻了内存和线程池的压力.当然,当时不能使用线程静态等内容,因此必须使用逻辑调用上下文或由自定义SynchronizationContext或TaskScheduler设置的Current值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |