picbox.BorderStyle = BorderStyle.FixedSingle |跨线程操作无效
picbox.BorderStyle = BorderStyle.FixedSingle | Cross-thread operation not valid
我正在开发一个在网格中加载图像的 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 的方式相同,但不确定会怎样。
谢谢,
马蒂亚斯
您在另一个线程中执行 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# 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 的方式相同,但不确定会怎样。
谢谢,
马蒂亚斯
您在另一个线程中执行 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(...)