我用Pcap.Net交通监控,我需要它,直到用户请求取消接收数据包。创建监视任务这样(简化):中止任务包含永无止境的库法(无检查取消申请的能力)
var task1 = Task.Run(() => { communicator.ReceivePackets(0, PacketHandlerCallback); } /*, token*/);
这里0
说的ReceivePackets
执行永远不会结束,PacketHandlerCallback
是每个接收的数据包将被执行的方法。 ReceivePackets
是同步的并且不支持取消。一般在我的问题它可能是任何其他无尽的同步方法,我们不能编辑代码。
的问题是如何制止这种方法执行?
刚好路过取消标记的任务没有帮助,因为我们也应明确检查要求取消,E。 G。通过调用
token.throwIfCancellationRequested()
。将令牌传递给回调方法也不是一个解决方案,因为直到接收到新数据包时才会调用此方法,但是我希望在取消后立即停止我的任务。
使用
BackgroundWorker
会导致相同的问题,因为我们应该检查CancellationPending
。创建
task2
定期检查取消请求,然后写var task = Task.WhenAny(task1, task2)
没有帮助,因为ReceivePackets
仍将执行。
我应该使用Thread.Abort()
或许有其他优雅的解决方案?
有关于TPL的类似问题,所以我找不到任何简单而有用的答案。
你可能要考虑设置'communicator.NonBlocking = TRUE;然后重写你的代码在非阻塞模式下使用'communicator.ReceiveSomePackets'代替,那么你不必担心代码被挂起,你可以在想要清理所有东西的时候处理通信器。 –
@斯科特很好的建议,谢谢。我知道这不是什么问题,但现在正是我需要的。请你确认一下,如果我写'while(true){communicator.ReceiveSomePackets(/ * args * /); token.throwIfCancellationRequested(); }'对于非阻塞通信器我不会丢失在取消请求检查期间可以接收的数据包? –
以前从未使用过图书馆,我只查了一下资料来源,看到了房产和房产票据。 –