C#-中止任务,其中包含永无休止的库方法(无法检查取消请求)
作者:互联网
我使用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 on SO也有类似的问题,但是我找不到任何简单而有用的答案.
解决方法:
在无法取消比Thread.Abort更好的解决方案的情况下,将不可取消的代码放入可以杀死的单独进程中.
这样可以保证释放线程所拥有的所有资源,因为当进程退出时,操作系统将释放所有持有的非托管OS资源(例如句柄),如果中止线程或使用单独的AppDomain关机,则不会出现此行为. .
当您编写了第二个进程时,可以使用WCF over named pipes之类的东西,这样您就可以与外部进程进行交互,就像您在进程内部的其他任何普通函数一样.
标签:cancellation,task-parallel-library,asynchronous,pcap-net,c 来源: https://codeday.me/bug/20191111/2018931.html