Utilisation de SynchronizationContext pour renvoyer des événements à l'interface utilisateur pour WinForms ou WPF

Je suis en utilisant un SynchronizationContext de maréchal des événements de nouveau à la thread de l'INTERFACE utilisateur de ma DLL qui fait beaucoup de multi-thread tâches en arrière-plan.

Je sais que le pattern singleton n'est pas un favori, mais je l'utilise pour l'instant pour stocker une référence de l'INTERFACE utilisateur du SynchronizationContext lorsque vous créez foo de l'objet parent.

public class Foo
{
    public event EventHandler FooDoDoneEvent;

    public void DoFoo()
    {
        //stuff
        OnFooDoDone();
    }

    private void OnFooDoDone()
    {
        if (FooDoDoneEvent != null)
        {
            if (TheUISync.Instance.UISync != SynchronizationContext.Current)
            {
                TheUISync.Instance.UISync.Post(delegate { OnFooDoDone(); }, null);
            }
            else
            {
                FooDoDoneEvent(this, new EventArgs());
            }
        }

    }
}

Cela ne fonctionne pas du tout dans WPF, le TheUISync instances de l'INTERFACE utilisateur de synchronisation (qui se nourrissent à partir de la fenêtre principale) ne correspond jamais avec l'actuel SynchronizationContext.Actuel. Dans un formulaire windows quand je fais la même chose qu'ils vont match après une invoquer et nous reviendrons vers le thread approprié.

Ma dose, je déteste ça, ressemble

public class Foo
{
    public event EventHandler FooDoDoneEvent;

    public void DoFoo()
    {
        //stuff
        OnFooDoDone(false);
    }

    private void OnFooDoDone(bool invoked)
    {
        if (FooDoDoneEvent != null)
        {
            if ((TheUISync.Instance.UISync != SynchronizationContext.Current) && (!invoked))
            {
                TheUISync.Instance.UISync.Post(delegate { OnFooDoDone(true); }, null);
            }
            else
            {
                FooDoDoneEvent(this, new EventArgs());
            }
        }

    }
}

J'espère donc que cet échantillon fait assez de bon sens à suivre.

source d'informationauteur Joel Barsotti