今天尝试使用SwitchTo方法切换到GUI线程,发现我举出来的例子不起作用,只是因为方法不存在。
然后我在这里找到了这个简介:
我们摆脱它的原因是因为它太危险了。另一种方法是将您的代码捆绑在 TaskEx.Run 中...
我的问题很简单:为什么它很危险?使用它会导致哪些具体危险?
请注意,我确实阅读了该帖子的其余部分,因此我明白这里存在技术限制。我的问题仍然是,如果我知道这一点,为什么它很危险?
我正在考虑重新实现辅助方法以赋予我指定的功能,但如果有一些根本性的问题,除了有人认为它很危险之外,我不会这样做。
具体来说,非常天真地,这是我考虑实现所需方法的方式:
public static class ContextSwitcher
{
public static ThreadPoolContextSwitcher SwitchToThreadPool()
{
return new ThreadPoolContextSwitcher();
}
public static SynchronizationContextSwitcher SwitchTo(this SynchronizationContext synchronizationContext)
{
return new SynchronizationContextSwitcher(synchronizationContext);
}
}
public class SynchronizationContextSwitcher : INotifyCompletion
{
private readonly SynchronizationContext _SynchronizationContext;
public SynchronizationContextSwitcher(SynchronizationContext synchronizationContext)
{
_SynchronizationContext = synchronizationContext;
}
public SynchronizationContextSwitcher GetAwaiter()
{
return this;
}
public bool IsCompleted
{
get
{
return false;
}
}
public void OnCompleted(Action action)
{
_SynchronizationContext.Post(_ => action(), null);
}
public void GetResult()
{
}
}
public class ThreadPoolContextSwitcher : INotifyCompletion
{
public ThreadPoolContextSwitcher GetAwaiter()
{
return this;
}
public bool IsCompleted
{
get
{
return false;
}
}
public void OnCompleted(Action action)
{
ThreadPool.QueueUserWorkItem(_ => action(), null);
}
public void GetResult()
{
}
}
这将允许我编写如下代码:
public async void Test()
{
await ContextSwitcher.SwitchToThreadPool(); // ensure we're not bogging down the UI thread
// do some heavy processing
await _UIContext.SwitchTo(); // presumably saved from the main thread
// update UI with new data
}