Почему «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
}

Ответы на вопрос(2)

Ваш ответ на вопрос