Multithreading SwtichToContext不会返回到原始线程

Multithreading SwtichToContext不会返回到原始线程,multithreading,asynchronous,f#,Multithreading,Asynchronous,F#,我正在使用一个只能在主线程上访问其对象的API,因此我需要创建一个用于GUI的新线程,然后切换回原始线程以进行涉及API的任何冗长计算 到目前为止,我有以下代码: [<EntryPoint; STAThread>] let main _ = Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] - Inital thread") let initCtx = Synchronizatio

我正在使用一个只能在主线程上访问其对象的API,因此我需要创建一个用于GUI的新线程,然后切换回原始线程以进行涉及API的任何冗长计算

到目前为止,我有以下代码:

[<EntryPoint; STAThread>]
let main _ =
    Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] - Inital thread")
    let initCtx = SynchronizationContext.Current
            
    let uiThread = new Thread(fun () ->
        let guiCtx = SynchronizationContext.Current
        Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] - New UI thread")
        async{
            do! Async.SwitchToContext initCtx
            Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] - Back to initial thread")
            // Lengthy API calculation here
            do! Async.SwitchToContext guiCtx
            Debug.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] - Back to UI thread")

        } |> Async.RunSynchronously        
    )
    uiThread.SetApartmentState(ApartmentState.STA)
    uiThread.Start()
    1
因此,它似乎没有像我预期的那样切换上下文。通过这种方式创建新线程后,如何切换回原始线程



我试过打电话
SynchronizationContext.SetSynchronizationContext(new Dispatchers SynchronizationContext(Dispatcher.CurrentDispatcher))
首先确保原始线程具有有效的
SynchronizationContext
,但这会导致程序在
Async.SwitchToContext
行退出,而不会引发任何异常

我还尝试使用
Async.startimimediate
而不是
RunSynchronously
,结果相同


如果我同时尝试这两种方法,那么程序只会在
Async.SwitchToContext
行冻结,而不是退出。

这是我尝试执行此操作时阅读的文章之一,但是当我调用
Async.SwitchToContext initCtx
时,它为什么不把我带回线程1?我希望SynchronizationContext.Current在您获取它时为null。我已经尝试调用
SynchronizationContext.SetSynchronizationContext(new Dispatchers SynchronizationContext(Dispatcher.CurrentDispatcher))
首先,我相信这将设置同步上下文。当前的,但如果我这样做,它将永远不会到达第三个调试语句,程序似乎只是挂在SwitchToContext行上。我认为另一个潜在的问题是,你的主线程无论如何都会完成,所以没有办法返回到它。为什么要这样构造代码?通常,主线程将是GUI线程。
[1] - Inital thread
[4] - New UI thread
[5] - Back to initial thread
[5] - Back to UI thread