picbox.BorderStyle = BorderStyle.FixedSingle |跨线程操作无效

时间:2015-08-22 14:55:49

标签: c# multithreading winforms parallel-processing

我正在开发一个C#Winforms项目,它在网格中加载图像,我实现了并行性和线程来学习一些关于它的东西,这是我无法弄清楚的。我需要在运行时更改一组图片框的BorderStyle,这是我的代码:

Task.Factory.StartNew(() =>
    {
        Parallel.For(0, img.Count, i =>
        {
            Bitmap tmp_b = new Bitmap((System.Drawing.Image)img[i].RenderImage(0));
            imagenes[i] = tmp_b;
            Progress_Bar_Loading_Images.Invoke((Action)delegate { reportarprogreso(); });
        });
        for (int i = inicio_set; i < final_set; ++i)
        {
            picbox[i].Image = imagenes[i];
            picbox[i].BorderStyle = BorderStyle.FixedSingle;
        }
    });

问题在于这一行:picbox[i].BorderStyle = BorderStyle.FixedSingle;我收到一条错误消息:控件''从其创建的线程以外的线程访问。

我想我知道为什么会这样,但我不太清楚如何解决它。我尝试将for (int i = inicio_set; i < final_set; ++i)放在任务之外,但图像不会被分配到图片框,因为它是一个不同的线程(主要),并且图像在任务完成之前不可用所以我想我需要更新BorderStyle与更新ProgressBar的方式相同,但不确定是怎么回事。

谢谢,

的Matias。

1 个答案:

答案 0 :(得分:2)

您在另一个线程中执行for循环。

for正文更改为:

if (picbox[i].InvokeRequired)
{
    picbox[i].Invoke(new Action(() =>
    {
        picbox[i].BorderStyle = BorderStyle.FixedSingle;
    }));
}
else
{
      picbox[i].BorderStyle = BorderStyle.FixedSingle;
}

或只是在任务中使用Async - Await;调用方法Async和任务:

await Task.Factory.StartNew(...)