Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我的线程调用另一个线程时,如何检查BackgroundWorker.CancellationPending?_C#_Multithreading_Backgroundworker_Sharppcap_Pcap.net - Fatal编程技术网

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

C# 当我的线程调用另一个线程时,如何检查BackgroundWorker.CancellationPending?,c#,multithreading,backgroundworker,sharppcap,pcap.net,C#,Multithreading,Backgroundworker,Sharppcap,Pcap.net,我应该如何检查BackgroundWorker DoWork方法中的CancellationPending,当在该方法中调用Pcap.Net数据包捕获例程时,该例程通过回调进行响应。我能想到的两个选择是: a) 在DoWork方法的底部写一个循环,以持续检查CancellationPending b) 将检查放在我编写的回调方法中,Pcap.Net将回调到该方法中,但毫无疑问,这里的潜在问题是,在另一个补丁匹配发生并且出现回调之前,取消无法工作 建议 public class MainClass

我应该如何检查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

      }

    }

将取消推迟到下一个补丁匹配之前没有错;这就是后台工作人员的工作方式。

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

另一方面,getNextPackage()确实需要BGW。您必须以足够短的读取超时打开设备,以便能够足够快地看到CancellationPending标志。您还必须处理将其显示在UI上的开销,ReportProgress并不便宜。当您每秒调用UI的次数超过1000次时,会将其冻结


我想知道我们是不是在讨论同一个库…

所以我打算将数据包响应聚合为1秒摘要,只计算1秒期间的摘要数字,然后每秒将其反馈给UI一次。我认为将这个聚合从UI线程卸载给backgroundworker对doSounds来说是一件好事。使用带有超时的GetNextPackage,事件将在错误的线程上引发。获得1秒的间隔将有点棘手。事实上这是库(不是sharppcap)事实上很抱歉事实上(说真的)你推荐sharppcap的真正原因是什么?我发现,与SharpPcap相比,使用pcap.net我可以更轻松地通过IntelliSense访问IP/TCP数据包属性。我仍然不确定哪一个是最可靠的还是最常用的。@Greg我不确定是否是这种情况。看一看。获取捕获的数据包事件处理程序并将其解析为所需的特定标头是一个单步过程。在过去的一年里,我们做了大量的工作,使这个过程对用户来说更简单、更直观。