Вопрос или проблема
В настоящее время я делаю что-то вроде этого:
using (MemoryStream ms = new MemoryStream ())
{
using (rasterizer = new GhostscriptRasterizer ())
{
//растрировать.
rasterizer.CustomSwitches.Add ("-dNEWPDF=false");
rasterizer.Open (inputMS, gvi, false);
System.Drawing.Image preview = rasterizer.GetPage(200, 1);
preview.Save (ms, ImageFormat.Png);
result = ms.ToArray ();
ms.Close ();
}
rasterizer.Close ();
}
Я вижу, что сам Ghostscript поддерживает регистрацию функции обратного вызова для отмены, могу ли я как-то использовать GHostscript.net, чтобы позволить мне отменить вызов rasterizer.GetPage?
Ответ или решение
Ghostscript.Net действительно поддерживает возможность использования токенов отмены, что является важным аспектом для построения отзывчивых и управляемых приложений. Функционал Ghostscript позволяет зарегистрировать функцию обратного вызова для отмены операций, однако для реализации этой возможности в Ghostscript.Net потребуется несколько дополнительных шагов.
Как сделать задачу извлечения изображения отменяемой
Для реализации отменяемого процесса извлечения изображения с использованием Ghostscript.Net и токенов отмены, следуйте приведенному ниже пошаговому алгоритму.
-
Создайте CancellationTokenSource: Это позволит вам создавать токены отмены, которые можно передать в вашу задачу.
-
Передайте CancellationToken в задачу: Используйте токен внутри вашей задачи по извлечению изображения для проверки, был ли запрошен запрос на отмену.
-
Регистрация функции обратного вызова: Как вы упомянули, Ghostscript позволяет регистрировать колбек для отмены. Ваша задача будет проверять статус токена и вызывать функцию отмены, если таковая запрашивается.
Пример кода
Вот пример того, как вы можете структурировать ваш код для включения поддержки отмены:
public byte[] ExtractImageWithCancellation(MemoryStream inputMS, int gvi, CancellationToken cancellationToken)
{
using (MemoryStream ms = new MemoryStream())
{
using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
{
// Установка параметров для Ghostscript
rasterizer.CustomSwitches.Add("-dNEWPDF=false");
rasterizer.Open(inputMS, gvi, false);
// Регистрация обратного вызова на отмену
rasterizer.RegisterCancellationCallback(() =>
{
if (cancellationToken.IsCancellationRequested)
{
rasterizer.Cancel();
}
});
// Проверка на отмену перед вызовом GetPage
if (cancellationToken.IsCancellationRequested)
throw new OperationCanceledException(cancellationToken);
// Извлечение страницы
System.Drawing.Image preview = rasterizer.GetPage(200, 1);
preview.Save(ms, ImageFormat.Png);
return ms.ToArray();
}
}
}
Объяснение кода
-
CancellationTokenSource и Token: Вам нужно создать
CancellationTokenSource
, и передать его токен в методExtractImageWithCancellation
. -
Регистрация колбека: Внутри метода
RegisterCancellationCallback
происходит проверка токена на запрос отмены. Если запрос на отмену действительно поступил, вызывается методCancel()
у объектаrasterizer
. -
Проверка перед GetPage: Перед вызовом метода
GetPage
, осуществляется очередная проверка токена на предмет его отмены. Это важно, чтобы не запускать долгую операцию, если пользователь уже запросил отмену.
Заключение
Использование CancellationToken в сочетании с Ghostscript.Net позволяет эффективно управлять длительными и ресурсоемкими задачами, такими как извлечение изображений. Реализация проверки на отмену делает ваш код более адаптивным и отзывчивым к взаимодействию пользователя. Убедитесь, что вы обрабатываете значения, возвращаемые методами, и корректно управляете ресурсами, включая закрытие потоков и объектов, чтобы избежать утечек памяти.