Как вызвать сторонний метод, а затем, в случае неудачи, удалить все ресурсы, которые он использует

Я пытаюсь этим кодом преобразовать документ с помощью aspose word, я пытаюсь завершить процесс преобразования документа, когда он занимает слишком много времени (поскольку это приводит к утечке памяти и съедает все системные ресурсы), я никогда не смотрел на threading или async раньше, но теперь, когда наш рабочий сервер сломался, я ищу быстрое решение, прежде чем копать глубже,

Это то, что я пробовал, но это убивает поток, но сохраняет все ресурсы, я прочитал несколько сообщений из Что не так с использованием 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 часов, которые я тестировал до сих пор.


person Mathematics    schedule 22.12.2014    source источник
comment
Привет! Что вы имеете в виду под сохранением всех ресурсов?   -  person Yogster    schedule 22.12.2014
comment
@ Хорхе занимает все пространство памяти (ОЗУ)   -  person Mathematics    schedule 22.12.2014
comment
А AsposeConversion.ConvertToPDF — это метод блокировки, верно?   -  person Yogster    schedule 22.12.2014
comment
я бы предположил, что да   -  person Mathematics    schedule 22.12.2014
comment
Создайте новый домен приложения с функцией-оболочкой, которая вызывает сборку AsposeConversion. Если это займет слишком много времени, удалите этот домен приложения. Это убьет поток, а также выгрузит сборку Aspose и освободит все ресурсы, которые она выделяет. См. раздел Домены приложений.   -  person Jim Mischel    schedule 22.12.2014
comment
4 часа это ненормально, какой размер документа Word? Попробуйте сначала сохранить в docx, а потом в pdf. Таинственная проблема может быть решена при сохранении в docx. Если нет, сообщите об этом в службу поддержки Aspose на форумах, это должно быть исправлено в библиотеке.   -  person Saqib Razzaq    schedule 14.01.2015
comment
Документы динамические Saqib, я уже сообщил команде aspose несколько недель назад, они сказали, что воспроизвели проблему и исправят в будущем, когда я понятия не имел...   -  person Mathematics    schedule 15.01.2015


Ответы (1)


Поскольку AsposeConversion.ConvertToPDF является методом блокировки, вы не можете послать сигнал, чтобы поток завершился корректно, так как поток не будет проверять сигнал до тех пор, пока метод блокировки не завершится.

Все, что я могу предложить, это позволить потоку работать до тех пор, пока AsposeConversion.ConvertToPDF не вернется, затем проверить в потоке, не прошло ли максимально допустимое время, и если это так, очистить перед завершением.

Изменить. Зная, что вызов метода вообще не возвращается

Похоже, это проблема с Aspose, поэтому вы должны выяснить, почему вызов этого метода никогда не возвращается, и посмотреть, есть ли что-то, что вы делаете неправильно, или какой-либо обходной путь, если это ошибка.

Если вам не удается заставить метод работать должным образом, в качестве крайнего решения вы можете попробовать запустить код внутри Объект задания. Это позволит вам выполнять ваш код как отдельный процесс и ограничить память, которую может использовать процесс. Затем вы можете обработать исключение OutOfMemoryException и очистить его по мере необходимости.

Я знаю, это ужасно, но предотвратит сбой вашего сервера, пока вы ждете обходного пути / исправления ошибки.

person Yogster    schedule 22.12.2014
comment
AsposeConversion.ConvertToPDF никогда не возвращается... вот в чем проблема - person Mathematics; 22.12.2014
comment
Хорошо, в этом случае вы должны четко указать в своем вопросе. Слишком долго - это не то же самое, что никогда не возвращаться :-). Что касается вашей проблемы, похоже, это проблема с aspose, а не с многопоточностью, поэтому я боюсь, что не могу помочь. Вам нужно выяснить, почему AsposeConversion.ConvertToPDF ведет себя таким образом, и посмотреть, есть ли для этого какой-либо обходной путь. - person Yogster; 22.12.2014
comment
@CustomizedName, посмотрите мой отредактированный ответ. Да прибудет с тобой сила. - person Yogster; 22.12.2014
comment
Это одна из причин домены приложений были созданы. - person Jim Mischel; 22.12.2014