2010-07-21 28 views
0

Comment vérifier un CancellationPending dans une méthode BackgroundWorker DoWork, lorsque dans cette méthode j'appelle une routine de capture de paquets Pcap.Net, qui répond par un rappel. Les deux options que je peux penser est:comment vérifier pour BackgroundWorker.CancellationPending quand mon thread a appelé un autre?

a) écrire une boucle au fond de la méthode DoWork pour vérifier en permanence pour CancellationPending

b) mettre le contrôle dans la méthode de rappel, j'ai écrit ce qui Pcap.Net sera rappeler dans - mais sans aucun doute le problème potentiel ici est l'annulation ne peut pas fonctionner alors jusqu'à ce qu'un autre match patch se produit et il y a un rappel

suggestions?

public class MainClass { 
     private void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      var worker = sender as BackgroundWorker; 
      _packetCapturer = new PacketCapturer(); 
     } 

} 

    public class PacketCapturer 

     public PacketCapturer() { 
     // Start Capture Here 
     // Opens PacketCommunicator 
     // communicator.ReceivePackets(0, PacketCapturerCallback); 

     } 

     private static void PacketCapturerCallback(Packet packet) { 
     // Deal with returned packet 

     } 

    } 

Répondre

1

Vous n'avez pas besoin de BGW si vous utilisez l'événement OnPacketArrival. Facilite l'arrêt, il suffit d'appeler StopCapture().

L'autre manière, GetNextPacket() a besoin d'un BGW. Vous devez ouvrir l'appareil avec un délai d'attente de lecture suffisamment court pour que vous puissiez voir le drapeau CancellationPending assez rapidement. Vous aurez également à faire face à la surcharge de l'affichage sur votre interface utilisateur, ReportProgress est pas pas cher. Et gèle l'interface utilisateur lorsque vous l'appelez plus de ~ 1000 fois par seconde.

Je me demande si nous parlons la même bibliothèque ...

+0

donc j'allais agréger les réponses de paquets en 1 seconde résumés, seulement calculer un chiffre de synthèse pour la période de 1 seconde, puis une fois par seconde nourrir ce retour à l'interface utilisateur. Je pensais que le déchargement de cette agrégation à un arrière-plan du thread UI serait une bonne chose à faire – Greg

+0

Ça va. Utilisez GetNextPacket avec le délai d'attente, l'événement sera déclenché sur le mauvais thread. Obtenir les intervalles de 1 seconde sera un peu difficile. –

+0

en fait c'est http://pcapdotnet.codeplex.com/ bibliothèque (pas sharppcap) en fait désolé – Greg

1

Il n'y a rien de mal à retarder l'annulation jusqu'à la prochaine correspondance de correctif; C'est ainsi que BackgroundWorkers est censé fonctionner.