在Javascript中,回调(等待的异步函数)只在调用堆栈为空时运行。如果有多个回调,那么它们就会排队(在事件循环队列中),在下一个回调更改运行之前,只会运行一个回调。
在C#的情况下(假设ConfigureAwait没有设置为false,也就是说,callabck将在同一个线程中运行;也假设存在同步上下文winforms):
发布于 2021-09-04 13:24:21
答案是,它取决于当前的SynchronizationContext,如果是null,则取决于当前的TaskScheduler。
当awaited Task完成时,您已经将Awaitable配置为捕获上下文并在其上恢复,几乎可以肯定的是,该延续不能立即继续(线程可能正在忙着执行其他事情)。所能做的就是安排在当前SynchronizationContext上稍后执行的延续,这是通过调用SynchronizationContext.Post()来完成的。
如何实现此Post方法取决于SynchronizationContext (即abstract)。如果使用WPF,则SynchronizationContext是DispatcherSynchronizationContext。在那里,Post是通过调用Dispatcher.BeginInvoke()和DispatcherPriority.Normal来实现的。
换句话说,您的继续将在dispatcher上排队等待稍后的执行,并具有正常的优先级。其他委托可能具有更高的优先级(例如,DispatcherPriority.Input),但最终您的委托将在dispatcher上执行。
有两件事要注意:
BeginInvoke只是对您的委托进行排队。它不会马上执行。换句话说,排队您的委托是非常快的。https://stackoverflow.com/questions/69026848
复制相似问题