我试图用SWITCHTO方法今天切换到GUI线程,并发现我举起它的例子不工作,仅仅是因为该方法是不存在的。
然后我发现这个Blurb的在这里 :
我们摆脱它的原因是因为它是如此的危险。 另一种方法是捆扎内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
}