代码之家  ›  专栏  ›  技术社区  ›  Greg

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

  •  0
  • Greg  · 技术社区  · 14 年前

    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 回复  |  直到 14 年前
        1
  •  1
  •   Hans Passant    14 年前

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

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

    我想知道我们是不是在谈论同一个图书馆。。。

        2
  •  1
  •   SLaks    14 年前

    把取消推迟到下一个补丁匹配是没有错的;这就是幕后工作者的工作方式。