首页 / C# / c# – 如何取消挂起的任务?
c# – 如何取消挂起的任务?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何取消挂起的任务?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1758字,纯文字阅读大概需要3分钟。
内容图文
![c# – 如何取消挂起的任务?](/upload/InfoBanner/zyjiaocheng/788/f3a99303bcfb44b8a41f68891a12a858.jpg)
我们有一个Windows服务调用第三方方法,当最终用户不正确配置时,该方法可能会挂起,这很难事先测试.我们通过在超时中调用Task中的方法来处理这种风险:
private int? FooWithTimeout()
{
var timeout = TimeSpan.FromMinutes(1);
var task = Task.Run(Foo);
if (!task.Wait(timeout))
{
Log("Foo timed out...");
return null;
}
if (task.IsFaulted)
{
Log("Foo threw an exception...");
return null;
}
return task.Result;
}
第三方方法永远阻止等待来自无法响应的资源的输入.它不支持以任何方式,形状或形式取消,也不支持内置超时.我们担心的是,随着服务运行,这些任务将继续阻塞并慢慢积累,最终消耗大量资源.
这是一个有效的问题吗?我们需要以某种方式中止/处理任务吗?如果是这样,这样做的正确方法是什么?
附录:第三方是Crystal Reports.当要求打印到需要用户提供某种额外输入的打印机时,它会挂起(例如,如果您打印文件,Microsoft XPS Document Writer会提示您保存文件的位置).挂起,我的意思是它试图显示用户提示以获取额外的输入,但它在Windows服务中,所以没有人看到用户提示,它等待人类永远告诉它如何打印.我们允许最终用户配置服务尝试打印到哪台打印机,并且没有任何方法可以判断给定打印机是否需要额外的输入,而不是尝试打印到它.
解决方法:
Our concern is that as the service runs these tasks will continue blocking and slowly accumulate
这是一个有效的问题.您可以通过在使用小堆栈的特殊线程池上启动这些任务来减少其后果.这样就减少了内存使用量.但这不是一个完整的解决方案.如果你的应用程序必须运行很长时间(不是用于几个小时的GUI应用程序),那么这个解决方案将被证明是不可接受的,因为最终应用程序将遭受资源耗尽.
.NET无法终止不合作的线程.您需要在自己的进程中运行这些操作.然后,您可以安全地终止这些进程.
使用AppDomains也可能是安全的,但不太确定.当AppDomain和其中的线程中止时,每个进程状态可能会被破坏.此外,并非所有线程都可以中止.特别是IO操作.
使用单独的流程也不能保证终止不会导致状态损坏.但在实践中,大多数腐败状态都存在于记忆中.进程终止可能会清除所有不一致的状态.
内容总结
以上是互联网集市为您收集整理的c# – 如何取消挂起的任务?全部内容,希望文章能够帮你解决c# – 如何取消挂起的任务?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。