2009-11-05 19 views
1

Je souhaite utiliser un BackgroundWorker ou un Thread pour appeler une méthode de mon formulaire Windows sur une classe située dans ma couche de gestion. Je voudrais que la méthode dans cette couche de gestion puisse signaler sa progression si quelqu'un écoute, car cela peut prendre un certain temps avant d'être terminé. Depuis que je peux commencer avec un BackgroundWorker et décider plus tard d'utiliser un fil régulier, je ne veux pas être lié à l'un ou l'autre.Notifier BackgroundWorker de Progress Changement d'une autre classe

Quel serait le meilleur moyen pour une méthode de rapporter sa progression si elle ne sait pas si elle a été appelée par un arrière-plan? Je pensais fournir un événement sur mon cours de calque d'affaires qui pourrait publier ses progrès si quelqu'un écoutait.

Y a-t-il déjà un délégué dans le Framework pour cela? Mieux encore une interface que je pourrais implémenter - quelque chose comme INotifyProgressChanged?

Répondre

0

Je crois que vous allez la bonne direction avec le tir d'un gestionnaire d'événements, vous pouvez déclarer un événement dans votre classe (en utilisant VB, C# est similaire bien sûr) en tant que tel:

Public Event foo(ByVal progressVar1 As Double, ByVal progressVar2 As String) 

puis ajouter quelques gestionnaires à vos winforms. Le problème qui se pose ici est que les événements déclenchés s'exécuteront sur le même thread que le threadback worker ou thread, donc vous devrez toujours utiliser la méthode Invoke() pour jouer avec l'interface utilisateur.

0

Vous pourriez utiliser BackgroundWorker, voici quelques événements que vous pouvez vous abonner,

bgObj.DoWork += (sender, e)=>{ // do something in your business layer} 
    bgObj.RunWorkerCompleted += (sender, e)=>{ // do something} 
    bgObj.ProgressChanged += (sender, e)=>{ // do something}  

Vous pouvez déclarer des événements publics au sein de votre couche d'affaires (Est-ce que le travail réel), et augmenter les événements à des endroits appropriés pour que l'abonné (disons du formulaire) puisse recevoir les notifications.

(Remarque: en dehors du thread d'interface utilisateur, il se peut que vous ne puissiez pas mettre à jour le contrôle de l'interface utilisateur, consultez la méthode control1.BeginInvoke)