Поддерживает ли Ghostscript.Net токены отмены? Если да, как я могу сделать задачу извлечения изображения отменяемой?

Вопрос или проблема

В настоящее время я делаю что-то вроде этого:

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 и токенов отмены, следуйте приведенному ниже пошаговому алгоритму.

  1. Создайте CancellationTokenSource: Это позволит вам создавать токены отмены, которые можно передать в вашу задачу.

  2. Передайте CancellationToken в задачу: Используйте токен внутри вашей задачи по извлечению изображения для проверки, был ли запрошен запрос на отмену.

  3. Регистрация функции обратного вызова: Как вы упомянули, 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();
        }
    }
}

Объяснение кода

  1. CancellationTokenSource и Token: Вам нужно создать CancellationTokenSource, и передать его токен в метод ExtractImageWithCancellation.

  2. Регистрация колбека: Внутри метода RegisterCancellationCallback происходит проверка токена на запрос отмены. Если запрос на отмену действительно поступил, вызывается метод Cancel() у объекта rasterizer.

  3. Проверка перед GetPage: Перед вызовом метода GetPage, осуществляется очередная проверка токена на предмет его отмены. Это важно, чтобы не запускать долгую операцию, если пользователь уже запросил отмену.

Заключение

Использование CancellationToken в сочетании с Ghostscript.Net позволяет эффективно управлять длительными и ресурсоемкими задачами, такими как извлечение изображений. Реализация проверки на отмену делает ваш код более адаптивным и отзывчивым к взаимодействию пользователя. Убедитесь, что вы обрабатываете значения, возвращаемые методами, и корректно управляете ресурсами, включая закрытие потоков и объектов, чтобы избежать утечек памяти.

Оцените материал
Добавить комментарий

Капча загружается...