2009-04-24 8 views
1

J'écris un toast qui doit être thread-safe car il est utilisé pour signaler l'état de l'entrée socket asynchrone. J'ai essayé de le rendre sécuritaire pour les threads, mais les toasts sont toujours bloqués.Thread-safe Form.Show

public static void Show(string message) { 
     Toast toast = new Toast(message); 
     toast.ShowAction(); 
    } 

    private delegate void InvokeCallback(); 

    public void ShowAction() { 
     if (InvokeRequired) { 
      Invoke(new InvokeCallback(ShowAction)); 
     } 
     else { 
      Show(); 
     } 
    } 

Je veux être en mesure de les afficher facilement comme une boîte de message, à savoir Toast.Show("Status changed");. Toute aide serait grandement appréciée.

Répondre

1

Votre problème est le fait que le Toast est en cours de création sur un autre thread. Ce que vous aurez probablement besoin de faire est d'avoir une "cible" sur le thread principal de l'interface utilisateur où vous pouvez Invoke() la création et l'affichage du Toast, en gardant toutes les interfaces utilisateur sur le même thread.

EDIT

Si vous devez être en mesure de garder cela sur un autre thread, votre seule autre option est de créer un autre thread avec une boucle de message.

Thread t = new Thread(); 

t.SetApartmentState(ApartmentState.STA) // Required for a UI thread 

En ce qui concerne l'implémentation des tâches d'envoi et des messages à ce sujet, je vous laisse le soin de le faire. Vous devez appeler le Application.Run() au début pour lancer la boucle de votre message. Et, comme toujours, vous devrez vous assurer de Invoke() toutes les opérations de votre Toast (ou tout ce qui est sur ce thread) qui peuvent interagir avec le thread principal de l'interface utilisateur.

+0

Vous pouvez exécuter, sur le même thread qui crée le formulaire, une boucle de message autour du formulaire. Faites simplement: Application.Run (forme); Notez que le formulaire est maintenant sous contrôle, vous avez donc besoin du formulaire pour se fermer lorsque cela est approprié. –

+0

@lassevk: NON NON NON! Ne jamais démarrer une boucle de message sur un fil que vous ne démarrez pas. Cela pourrait avoir des conséquences désastreuses! –

Questions connexes