我正在尝试使用aspose字转换文档的代码,我试图在文件转换时间过长时终止文件转换过程(因为它会导致内存泄漏并占用所有系统资源),我从来没有看过在threading
或async
之前,但现在我们的生产服务器已经损坏,我正在寻找快速解决方案,然后再深入挖掘,
这是我尝试的但它杀死了线程但保留了所有资源,我从What's wrong with using Thread.Abort()读了一些帖子但是我不确定什么是最好的前进方式,我应该使用Task和async但是我不知道如何在这种情况下使用它们,
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个小时内从未返回..
答案 0 :(得分:1)
由于AsposeConversion.ConvertToPDF
是阻塞方法,因此在阻塞方法完成之前,线程不会检查信号,因此无法发送信号告诉线程正常结束。
我所能建议的是让线程运行直到AsposeConversion.ConvertToPDF
返回,然后在线程内检查是否已经过了最大允许时间,如果是这样,则在终止之前进行清理。
看起来这是Aspose的一个问题,所以你应该找出为什么那个方法调用永远不会返回,看看是否有错误,或任何解决方法,如果它是一个bug。
如果您无法使方法按预期工作,作为极端解决方案,您可以尝试在Job object内运行代码。它允许您将代码作为单独的进程执行,并限制进程可以使用的内存。然后,您可以处理OutOfMemoryException并根据需要进行清理。
我知道这太可怕了,但是当你等待解决方法/错误修复时,会阻止你的服务器崩溃。