Répondre

3

Vous aurez besoin d'ajouter de la synchronisation et d'avoir une place pour que l'agent d'arrière-plan puisse lire les données.

Vous ne pouvez pas (facilement) envoyer des données à l'arrière-plan. Il est beaucoup plus facile d'avoir un endroit où le travailleur peut rechercher des données, et vous pouvez simplement ajouter des données à traiter. Assurez-vous simplement de mettre la synchronisation en place sur ce point, puisque (au moins) deux threads accéderont aux données potentiellement au même moment.

+0

C'est ce que je pensais, y a-t-il un meilleur exemple producteur/consommateur que Mr Skeets? http://www.yoda.arachsys.com/csharp/threads/deadlocks.shtml – SwDevMan81

+0

Son est une option très propre et discrète. Il serait possible, dans certaines circonstances, d'utiliser un ReaderWriterLock à la place, ce qui pourrait être meilleur (mais seulement dans certains cas), car il ne bloquerait pas les lecteurs. Voir: http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx –

+0

Super, je vais vérifier cela et voir si je peux utiliser cela. Merci – SwDevMan81

2

Il n'existe aucun mécanisme pris en charge dans l'API BackgroundWorker pour transmettre des données supplémentaires après le démarrage de la tâche.

Toutefois, la routine de travail s'exécute simplement sur un thread différent. Vous pouvez transmettre des données à ce thread de la même manière que vous transmettez des données entre deux threads arbitraires. Quelques exemples rapides sur la façon ...

  • Changement d'état sur les variables statiques (probablement mal)
  • de changement d'état de l'objet initialement transmis à la routine des travailleurs (encore un mal peu si pas contrôlé correctement)

Vous devez examiner attentivement l'impact de synchronisation de ces approches.

0

Je préfère utiliser une file d'attente statique que le thread d'arrière-plan qui vérifie périodiquement les nouveaux messages. Cela permet au thread d'arrière-plan de fonctionner à son propre rythme. Vous pouvez utiliser les méthodes de rappel pour retourner au thread principal. Et comme l'a dit Reed, utilisez la synchronisation, comme un objet statique pour verrouiller.

Questions connexes