C#,当主线程变为空闲时如何在主线程中运行一个函数

时间:2014-05-21 10:07:58

标签: c# asynchronous

我正在尝试将Dart应用程序移植到C#,在我的dart应用程序中,我使用Futures异步排队函数,以便队列将在将来的某个时刻执行每个后续函数,当它转入VM的异步时调用队列,但重要的是这些是在“根线程”中运行的。我知道这对Dart VM非常具体,但我想知道在C#中是否可以做类似的事情。我基本上希望能够传递一个函数,该函数不接受某些方法或对象的参数,当主线程发现它没有更多的工作要做时,它将在主线程中调用该函数。我还应该说我的代码是用于服务,而不是UI应用程序。

1 个答案:

答案 0 :(得分:1)

你可以通过创建自己的自定义SynchronizationContext来做到这一点,Stephen Toub有一篇关于如何做到这一点的文章hereSynchronizationContext用于安排要完成的工作。因此,通过自己滚动,您需要保留要完成的工作队列,然后执行队列中的每个操作。

您可以对此进行自定义,以便在队列为空(即SynchronizationContext空闲时)时执行您需要的操作。有关上下文here的更多信息。

将要执行的内容发送到特定SyncrhonizationContext的有效方法是使用Task.Run。下面的代码将安排您的代码在当前的SC中运行。使用Task.Run而不指定TaskScheduler将在线程池线程上安排工作。

Task.Run( () =>/* you code */, CancellationToken.None, TaskScheduler.FromCurrentSynchronizationContext());