Переносимая библиотека классов, эквивалентная Dispatcher.Invoke или Dispatcher.RunAsync

В.NET, Windows 8 и Windows Phone 7 у меня есть код, похожий на этот:

public static void InvokeIfRequired(this Dispatcher dispatcher, Action action)
{
    if (dispatcher.CheckAccess())
    {
        action();
    }
    else
    {
        dispatcher.Invoke(action);
    }
}

Как мне что-то сделать в переносимой библиотеке классов? Было бы неплохо иметь одну независимую от платформы реализацию этого. Моя идея состоит в том, чтобы использовать TPL, который недоступен в WP7, но определенно скоро будет.

// PortableDispatcher must be created on the UI thread and then made accessible 
// maybe as a property in my ViewModel base class.
public class PortableDispatcher
{
    private TaskScheduler taskScheduler = TaskScheduler.FromCurrentSynchronizationContext();

    public void Invoke(Action action)
    {
        if (Alread on UI thread. How would I do this.)
        {
            action();
        }

        Task.Factory.StartNew(
            action, 
            CancellationToken.None,
            TaskCreationOptions.None,
            taskScheduler);
    }
}

Единственное, в чем я не уверен, так это в том, каковы будут последствия этого для производительности. Возможно, я сделаю некоторые тесты.

10
задан marc_s 29 June 2012 в 08:28
поделиться