如何调用第三方方法,然后如果失败,则删除其使用的所有资源
本文关键字:删除 资源 失败 如果 何调用 调用 然后 方法 第三方 | 更新日期: 2023-09-27 18:34:53
我正在尝试使用此代码使用 aspose word 转换文档,我正在尝试在花费太长时间时终止文档转换过程(因为它会导致内存泄漏并消耗所有系统资源(,我以前从未看过threading
或async
,但现在随着我们的生产服务器损坏,我正在寻找快速修复,然后再深入挖掘,
这是我尝试过的,但它杀死了线程但保留了所有资源,我从使用 Thread.Abort(( 有什么问题中阅读了一些帖子,但我不确定前进的最佳方式是什么,我应该使用 Task 和异步,但我不知道如何在这种情况下使用它们,
RunWithTimeout(() =>
{
status = AsposeConversion.ConvertToPDF(licensePath, fileName);
}, TimeSpan.FromMilliseconds(1000 * 60 * 4));
public static bool RunWithTimeout(ThreadStart threadStart, TimeSpan timeout)
{
Thread workerThread = new Thread(threadStart);
workerThread.Start();
bool finished = workerThread.Join(timeout);
if (!finished)
workerThread.Abort();
return finished;
}
我应该创建一个新进程吗? 但是我怎样才能让它超时或在其中运行转换代码行。
编辑
很抱歉造成混乱,我说这需要太长时间,但实际上即使到目前为止我测试了 4 个小时,它也永远不会返回。.
由于 AsposeConversion.ConvertToPDF
是一种阻塞方法,因此您无法发送信号来告诉线程正常结束,因为线程在阻塞方法完成之前不会检查信号。
我所能建议的就是让线程运行直到AsposeConversion.ConvertToPDF
返回,然后在线程内检查是否已经过了允许的最大时间,如果是这样,请在终止前进行清理。
编辑 - 知道方法调用根本不返回后
看起来这是Aspose的问题,因此您应该找出为什么该方法调用永远不会返回,并查看您是否做错了什么,或者如果它是错误,则有任何解决方法。
如果您无法使该方法按预期工作,作为极端解决方案,您可以尝试在 Job 对象中运行代码。它将允许您将代码作为单独的进程执行,并限制进程可以使用的内存。然后,您可以处理 OutOfMemoryException 并根据需要进行清理。
我知道这很可怕,但可以防止您的服务器在您等待解决方法/错误修复时崩溃。