C#-中止任务,其中包含永无休止的库方法(无法检查取消请求)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-中止任务,其中包含永无休止的库方法(无法检查取消请求),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1329字,纯文字阅读大概需要2分钟。
内容图文
![C#-中止任务,其中包含永无休止的库方法(无法检查取消请求)](/upload/InfoBanner/zyjiaocheng/667/24e7391caaba4746b8a9a0c62af281d9.jpg)
我使用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之类的东西,这样您就可以与外部进程进行交互,就像您在进程内部的其他任何普通函数一样.
内容总结
以上是互联网集市为您收集整理的C#-中止任务,其中包含永无休止的库方法(无法检查取消请求)全部内容,希望文章能够帮你解决C#-中止任务,其中包含永无休止的库方法(无法检查取消请求)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。