我们有一个Windows服务,调用第三方方法时,如果最终用户配置不当,则可能会出现卡死的情况,这很难提前进行测试。我们通过在具有超时功能的任务中调用该方法来处理此风险:
第三方方法会无限期地阻塞,等待来自不能响应的资源的输入,它不以任何方式支持取消,也没有内置超时。我们担心随着服务的运行,这些任务将继续阻塞并缓慢积累,最终消耗大量资源。
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文档编写器,则会提示您保存文件的位置)时,它会挂起。所谓“挂起”,是指它尝试显示一个用户提示以获取额外的输入,但由于它在Windows服务中,因此没有人可以看到用户提示,并且它会永远等待一个人告诉它如何打印。我们允许最终用户配置服务尝试打印到哪个打印机,并且没有真正的方法可以短暂地判断给定的打印机是否需要额外的输入,除了尝试将其打印到该打印机。
Foo
是什么?它是一个阻塞线程的普通方法吗?如果您需要中止任务,这可能会有所帮助:https://dev59.com/rm445IYBdhLWcg3wmLZd#19311606 - Meirion Hughes