我正在一个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;我收到一条错误消息:Control''是从不是在其上创建线程的线程访问的。

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

谢谢,

Matias。

最佳答案

您在另一个线程中执行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(...)

关于c# - picbox.BorderStyle = BorderStyle.FixedSingle |跨线程操作无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32157499/

10-10 04:50