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