Как ждать, пока задача полностью завершится? - PullRequest
0 голосов
/ 22 января 2020

У меня есть приложение для обработки изображений, в котором у меня есть 2 режима. Ручная проверка и автоматическая проверка c с использованием команды PL C. Ручная проверка работает нормально, пользователь нажимает кнопку, чтобы получить изображение, а затем нажимает другую кнопку, чтобы обработать изображение и отправить результаты на PL C. Но в автоматическом режиме проверки c я получаю неверный результат проверки (тот же контроль продукта / изображения в ручном режиме дает правильный результат). Я подозреваю, что после получения изображения система не получает достаточно времени для чтения полного изображения до начала проверки, поэтому я добавил thread.sleep (500), но это не имело никакого значения. Поэтому я попробовал метод asyn c await.task.delay (500), тот же результат.

Есть ли другой способ исправить это?

Код:

 private async void timer3_Tick(object sender, EventArgs e)
    {

        btncheckm1_Click(null, null);
        var newSignal = textBox8.Text.Contains("+1");
        var isRisingEdge = newSignal && (_oldSignal == false);
        _oldSignal = newSignal;


        if (isRisingEdge)
        {

            lblmessages.Text = "";

            totalsheetcount++;

            btngrabimage_Click(null, null);

           // Thread.Sleep(300);
            await Task.Delay(1000);

           processimage();

        }


    }

btngrabimage () имеет следующий код:

      try
        {
        camimage = null;
        cam1.BeginAcquisition();
        // Retrieve an image 
        IManagedImage rawImage = cam1.GetNextImage();

        IManagedImage convertedImage = rawImage.Convert(PixelFormatEnums.Mono8);


        imagetoinspect = convertedImage.bitmap;          
        rawImage.Release();
        cam1.EndAcquisition();
        //cam1.DeInit();
        distort();
        }

        catch (Exception ee)
        {
        }

1 Ответ

0 голосов
/ 22 января 2020

Я бы также сказал, что завершение захвата изображения внутри задачи и ожидание этого результата - путь к go. Класс изображения представляет ваш тип возвращаемого значения в качестве изображения. Не против названия функций все же. Task.Run и Task.Factory.StartNew - это, по сути, одно и то же, просто хотелось показать, что у вас есть разные варианты создания задачи

    public class ImageRetriever
    { 
        public void ProcessImage()
        {
            //if you would like to get rid of the async
            //reminder that calling .Result is blocking for the current thread.
            //this means the thread will stop working untill the result is returned
            //could be an issue if this is called on UI thead
            var imageTask = GetImage();
            Image image = imageTask.Result;
        }

        public async Task ProcessImageAsync()
        {
            //if you want to keep the async-nonblocking
            Image image = await GetImage();
        } 
        private Task<Image> GetImage()
        {
            //this is how your create your task
            Task<Image> imageTask;
            imageTask = Task.Run(() =>
            {
                return new Image();
            });
            // or
            imageTask = Task.Factory.StartNew(() =>
            {
                return new Image();
            });
            return imageTask;
        }
    }

    public class Image
    {

    }
...