F#:在SynchronizationContext中同步启动Async


Async.SwitchSynchronizationContext允许Async操作切换到在给定的SynchronizationContext内运行。我希望同步SynchronizationContext中开始Async计算,而不是在Async中切换。

这将确保Async操作按所需顺序运行,并且它们不会同时运行。

这可能吗?Async.SwitchSynchronizationContext的文档提到使用SynchronizationContext.Post,但Async没有公开此类功能。

我还没有测试过这一点,但我认为实现您想要的最简单的方法是将SynchronizationContext.Send方法(在注释中提到)与Async.StartImmediate操作相结合。前者允许您在同步上下文中同步启动一些工作。后者允许您在当前上下文中启动异步工作流。

如果你将两者结合起来,你可以定义一个助手,在给定的同步上下文中启动一个函数,并在这个函数中立即启动一个异步工作流:

let startInContext (sync:SynchronizationContext) work = 
SynchronizationContext.Current.Send((fun _ -> 
Async.StartImmediate(work)), null)

例如:

async { 
printfn "Running on the given sync context"
do! Async.Sleep(1000)
printfn "Should be back on the original sync context" }
|> startInContext SynchronizationContext.Current

最新更新