提问人:Matias 提问时间:8/22/2015 最后编辑:Old FoxMatias 更新时间:8/22/2015 访问量:60
皮克框。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;
我想我知道为什么会发生这种情况,但我不太确定如何解决它。我尝试将任务放在外部,但图像不会被分配给图片框,因为它是一个不同的线程(主线程),并且图像在任务完成之前不可用,所以我认为我需要更新 BorderStyle 就像我更新 ProgressBar 一样,但不确定会如何。for (int i = inicio_set; i < final_set; ++i)
谢谢
马蒂亚斯。
答:
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 方法和任务:Async
Await
Async
await Task.Factory.StartNew(...)
评论