Почему «SwitchTo» был удален из Async CTP / Release?
Я попытался использовать метод 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
}