皮克框。BorderStyle = BorderStyle.FixedSingle |跨线程操作无效

picbox.BorderStyle = BorderStyle.FixedSingle | Cross-thread operation not valid

提问人:Matias 提问时间:8/22/2015 最后编辑:Old FoxMatias 更新时间:8/22/2015 访问量:60

问:

我正在开发一个 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;

我想我知道为什么会发生这种情况,但我不太确定如何解决它。我尝试将任务放在外部,但图像不会被分配给图片框,因为它是一个不同的线程(主线程),并且图像在任务完成之前不可用,所以我认为我需要更新 BorderStyle 就像我更新 ProgressBar 一样,但不确定会如何。for (int i = inicio_set; i < final_set; ++i)

谢谢

马蒂亚斯。

C# 多线程 WinForms 并行处理

评论


答:

2赞 Old Fox 8/22/2015 #1

在不同的线程中执行循环。for

将正文更改为:for

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

或者只是使用 - 在任务上;使 Caller 方法和任务:AsyncAwaitAsync

await Task.Factory.StartNew(...)