Multithreading SwtichToContext不会返回到原始线程
我正在使用一个只能在主线程上访问其对象的API,因此我需要创建一个用于GUI的新线程,然后切换回原始线程以进行涉及API的任何冗长计算 到目前为止,我有以下代码: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
[<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