Быстродействие потока, 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 { }
}