我已经在这个问题上打了很长时间了,我似乎无法找到解决这个问题的方法。简单地说,我需要向我的类提供并行编程,我正在制作一个演示,清楚地显示单线程和多线程之间的差异。
首先,程序会截取屏幕截图并将此类中的内容加载到bitmap
中。
然后,它会使用名为picturebox
的{{1}}加载winform。接下来它会screenshot
并将屏幕截图加载到Form1_Load
。
然后picturebox
运行for循环,它只是根据随机函数对周围的像素进行加扰,并从左到右更新图像。
示例:http://gyazo.com/ab04583bb33de59d08407886da1c4870
这一切都有效。 我现在想要制作它,以便第一个线程从左到中更新屏幕截图,第二个线程从中间到右边更新。
但是,当我把它放在2个单独的线程中时,它说"未处理的类型' System.InvalidOperationException'发生在System.Windows.Forms.dll"
错误意味着我正在进行非法的跨线程调用。特别是在Form1_Shown
上,也可能在screenshot
上。
Visual Studio通过将我链接到"How to: Make Thread-Safe Calls to Windows Forms Controls"
但我没有从这些信息中获得任何更明智的信息,这可能是因为我对C#术语还不是很流利。
我该如何处理/修复此问题?
这是所有事情发生的类(除了截图):
mybitmap
答案 0 :(得分:2)
您需要调用GUI线程。 我更喜欢以下解决方案。 使用Form成员(在本例中为'screenshot')检查InvokeRequired = true。如果是,则使用成员BeginInvoke()函数调用委托,如以下示例所示:
private void ScreenshotRefresh()
{
if(screenshot.InvokeRequired)
{
screenshot.BeginInvoke(new MethodInvoker(this.ScreenshotRefresh));
}
else
{
screenshot.Refresh();
}
}