我正在尝试将Dart应用程序移植到C#,在我的dart应用程序中,我使用Futures异步排队函数,以便队列将在将来的某个时刻执行每个后续函数,当它转入VM的异步时调用队列,但重要的是这些是在“根线程”中运行的。我知道这对Dart VM非常具体,但我想知道在C#中是否可以做类似的事情。我基本上希望能够传递一个函数,该函数不接受某些方法或对象的参数,当主线程发现它没有更多的工作要做时,它将在主线程中调用该函数。我还应该说我的代码是用于服务,而不是UI应用程序。
答案 0 :(得分:1)
你可以通过创建自己的自定义SynchronizationContext
来做到这一点,Stephen Toub有一篇关于如何做到这一点的文章here。 SynchronizationContext
用于安排要完成的工作。因此,通过自己滚动,您需要保留要完成的工作队列,然后执行队列中的每个操作。
您可以对此进行自定义,以便在队列为空(即SynchronizationContext
空闲时)时执行您需要的操作。有关上下文here的更多信息。
将要执行的内容发送到特定SyncrhonizationContext
的有效方法是使用Task.Run
。下面的代码将安排您的代码在当前的SC中运行。使用Task.Run
而不指定TaskScheduler
将在线程池线程上安排工作。
Task.Run( () =>/* you code */, CancellationToken.None, TaskScheduler.FromCurrentSynchronizationContext());