Как проверить BackgroundWorker.CancellationPending, когда мой поток вызвал другой? - PullRequest
0 голосов
/ 21 июля 2010

Как мне проверить наличие CancellationPending в методе BackgroundWorker DoWork, когда в этом методе я вызываю процедуру захвата пакета Pcap.Net, которая отвечает через обратный вызов.Я могу придумать два варианта:

a) написать цикл в нижней части метода DoWork, чтобы постоянно проверять CancellationPending

b) поставить проверку в метод обратного вызова, который я написал, которыйPcap.Net перезвонит - но, без сомнения, потенциальная проблема здесь в том, что отмена не может сработать, пока не произойдет совпадение другого патча и не будет получен обратный вызов

предложения?

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

      }

    }

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Вам не нужен BGW, если вы используете событие OnPacketArrival. Упрощает остановку, просто вызовите StopCapture ().

С другой стороны, GetNextPacket () требует BGW. Вы должны открыть устройство с достаточно коротким таймаутом чтения, чтобы вы могли достаточно быстро увидеть флаг CancellationPending. Вам также придется иметь дело с накладными расходами на отображение этого в вашем пользовательском интерфейсе, ReportProgress стоит , а не дешево. И останавливает пользовательский интерфейс, когда вы вызываете его чаще, чем ~ 1000 раз в секунду.

Интересно, если мы говорим об одной и той же библиотеке ...

1 голос
/ 21 июля 2010

Нет ничего плохого в том, чтобы отменить отмену до следующего патча; так должны работать BackgroundWorkers.

...