C # передать растровое изображение в задачу без ожидания - PullRequest
0 голосов
/ 26 января 2019

У меня есть событие, которое передает мне фрейм (Bitmap) в eventArgs.Я хочу обработать эту функцию события как можно быстрее, также после обработки этого события будет удалено это растровое изображение.Код выглядит следующим образом:

async void HandleEvent(object s, OnFrameArgs args)
{
    using(CustomBitmap bitmap = args.Frame.GetCopy())
    {
        await Task.Run( () => AnotherObject.CostlyOperationsOnBitmap(bitmap));
    }
    ProcessNext(); // Has to be called asap after handling this event
}

Дело в том, что я должен ждать этого Task.Run (), потому что в противном случае растровое изображение (копия 1) немедленно удаляется.Как я могу достичь этого, как я могу избавиться от этого ожидания и просто выбросить вычисления и начать обрабатывать следующую вещь.Я предполагаю, что мне нужно как-то передать растровое копирование в этот Task.Run (), но как ожидать только процесса создания копии, а затем НЕ ожидать ее вычислений И утилизировать эту растровую копию после выполнения вычислений.

1 Ответ

0 голосов
/ 26 января 2019

Предполагая, ProcessNext не зависит от CostlyOperationsOnBitmap

Вы могли бы просто сделать это

private void HandleEvent(object s, OnFrameArgs args)
{
   var bmp = args.Frame.GetCopy();

   Task.Run(() =>
        {
            try
            {
               AnotherObject.CostlyOperationsOnBitmap(bmp );
            }
            finally
            {
               bmp.Dispose();
            }   
        });

   ProcessNext(); // Has to be called asap after handling this event
}

* Примечание : Это украдет Thread из Threadpool , поэтому, если обработка занимает много времени и это событие часто запускается, вы вероятно, будет иметь обратное давление на TaskScheduler, чтобы освободить потоки для обработки, другие вещи могут нуждаться в этом преждевременном ресурсе ... Однако на самом деле это другой вопрос *

...