更新winform多线程

时间:2015-02-05 22:54:41

标签: c# .net multithreading winforms

我已经在这个问题上打了很长时间了,我似乎无法找到解决这个问题的方法。简单地说,我需要向我的类提供并行编程,我正在制作一个演示,清楚地显示单线程和多线程之间的差异。

首先,程序会截取屏幕截图并将此类中的内容加载到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

1 个答案:

答案 0 :(得分:2)

您需要调用GUI线程。 我更喜欢以下解决方案。 使用Form成员(在本例中为'screenshot')检查InvokeRequired = true。如果是,则使用成员BeginInvoke()函数调用委托,如以下示例所示:

private void ScreenshotRefresh()
 {         
     if(screenshot.InvokeRequired)
     {
         screenshot.BeginInvoke(new MethodInvoker(this.ScreenshotRefresh));    
     }
     else
     {
         screenshot.Refresh();
     }
 }