Быстродействие потока, Invoke - C#

Узнай цену своей работы

Формулировка задачи:

добрый день, задача следующая, обрабатываю изображение, что бы форма не зависала, делаю в отдельном потоке. И я заметил что в новом потоке эта задача решается раз 10 дольше, чем без потока, возможно мне показалось? или почему так? может какие то приоритеты у них есть? или мне это все кажется? и еще такой вопрос: у меня програсс бар крутиться пока поток работает(metroProgressSpinner), и чтобы его остановить приходиться инвок делать, т.к. к форме нельзя из нового потока обратиться, а в pictureBoxe картинку поменять получается прям из потока, хотя по логике там тоже инвок нужен, почему так?
        Bitmap first;
        Bitmap Second;
        private void clear()
        {
            Color c;
            for (int i = 0; i < first.Width; i++)
                for (int j = 0; j < first.Height; j++)
                {
                    c = first.GetPixel(i, j);
                    if (c.R < Convert.ToInt32(metroTextBox1.Text) && c.G < Convert.ToInt32(metroTextBox1.Text) && c.B < Convert.ToInt32(metroTextBox1.Text))
                    {
                        c = Color.FromArgb(0, 0, 0);
                    }
                    Second.SetPixel(i, j, c);
 
                }
 
            pictureBox2.Image = Second;
            Invoke(new STOP(stop));
        }
        public delegate void STOP();
        public void stop()
        {
 
            metroProgressSpinner1.Visible = false;
            metroProgressSpinner1.Enabled = false;
        }

Решение задачи: «Быстродействие потока, Invoke»

textual
Листинг программы
        private int level;
        private void clear()
        {
            Color c;
            for (int i = 0; i < w1.Width; i++)
                for (int j = 0; j < w1.Height; j++)
                {
                    c = w1[i, j];
                    if (c.R < level && c.G < level && c.B < level)
                    {
                        c = Color.FromArgb(0, 0, 0);
                    }
                    w2.SetPixel(new Point(i, j), c.R, c.G, c.B);
 
 
                }
            Invoke(new STOP(stop));
        }
        public delegate void STOP();
        public void stop()
        {
            w1.Dispose();
            w2.Dispose();
            pictureBox1.Image = first;
            pictureBox2.Image = Second;
            metroProgressSpinner1.Visible = false;
            metroProgressSpinner1.Enabled = false;
        }
 
        ImageWrapper w1;
        ImageWrapper w2;
        private void metroListView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                first = new Bitmap(files[metroListView1.SelectedIndices[0]]);
                
                Second = new Bitmap(first.Width, first.Height);
                w1 = new ImageWrapper(first);
                w2 = new ImageWrapper(Second);
                metroProgressSpinner1.Visible = true;
                metroProgressSpinner1.Enabled = true;
                level = Convert.ToInt32(metroTextBox1.Text);
                Task a = new Task(clear);
                a.Start();
            }
            catch { }
        }

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы