如何调用第三方方法然后如果失败则删除其使用的所有资源

时间:2014-12-22 13:08:38

标签: c# multithreading aspose

我正在尝试使用aspose字转换文档的代码,我试图在文件转换时间过长时终止文件转换过程(因为它会导致内存泄漏并占用所有系统资源),我从来没有看过在threadingasync之前,但现在我们的生产服务器已经损坏,我正在寻找快速解决方案,然后再深入挖掘,

这是我尝试的但它杀死了线程但保留了所有资源,我从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个小时内从未返回..

1 个答案:

答案 0 :(得分:1)

由于AsposeConversion.ConvertToPDF是阻塞方法,因此在阻塞方法完成之前,线程不会检查信号,因此无法发送信号告诉线程正常结束。

我所能建议的是让线程运行直到AsposeConversion.ConvertToPDF返回,然后在线程内检查是否已经过了最大允许时间,如果是这样,则在终止之前进行清理。

编辑 - 知道方法调用完全没有返回

看起来这是Aspose的一个问题,所以你应该找出为什么那个方法调用永远不会返回,看看是否有错误,或任何解决方法,如果它是一个bug。

如果您无法使方法按预期工作,作为极端解决方案,您可以尝试在Job object内运行代码。它允许您将代码作为单独的进程执行,并限制进程可以使用的内存。然后,您可以处理OutOfMemoryException并根据需要进行清理。

我知道这太可怕了,但是当你等待解决方法/错误修复时,会阻止你的服务器崩溃。