当我的线程调用另一个时,如何检查BackgroundWorker.CancellationPending?

时间:2010-07-21 02:54:37

标签: c# multithreading backgroundworker sharppcap pcap.net

如何在BackgroundWorker DoWork方法中检查CancellationPending,在此方法中,我调用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 个答案:

答案 0 :(得分:1)

在下一个补丁匹配之前延迟取消没有错;这就是BackgroundWorkers的工作方式。

答案 1 :(得分:1)

如果您使用OnPacketArrival事件,则不需要BGW。使其易于停止,只需调用StopCapture()。

另一方面,GetNextPacket() 需要一个BGW。您必须打开设备,其读取超时足够短,以便您可以足够快地看到CancellationPending标志。您还必须处理在UI上显示它的开销,ReportProgress 便宜。并且当你每秒调用它时,会冻结用户界面的频率超过每秒1000次。

我想知道我们是否在谈论同一个图书馆......