我有一个名为fetchImage的线程,它运行startFetch()方法,即
for (int i = 0; !stopFetching && i < 2000; i++) {
control.fetchImage().Save("Fetch_Image\\fetchedFile" + fileName + ".JPG", System.Drawing.Imaging.ImageFormat.Jpeg);
fileName++;
//Thread.Sleep(800);
Console.WriteLine("Filename :" + fileName);
control是另一个具有fetchImage()方法的类:
return (System.Drawing.Bitmap)mainForm.imageTemp.Clone();
mainForm
是一个包含名为imageTemp的Image变量的表单。现在startFetch()
运行正常Thread.Sleep(800)
但是它在没有睡眠的情况下给了我错误。这是错误的堆栈跟踪
System.InvalidOperationException was unhandled
Message=Object is currently in use elsewhere.
Source=System.Drawing
StackTrace:
at System.Drawing.Image.Clone()
at KiPNi.Control.fetchImage() in F:\CMPS285\285-fall10-5\Final working code\WindowsFormsApplication7\Control.cs:line 65
at KiPNi.Form4.startFetch() in F:\CMPS285\285-fall10-5\Final working code\WindowsFormsApplication7\Form4.cs:line 80
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
我对线程知之甚少(虽然我在遇到这个问题后尝试过)。
如何从fetchImage线程访问图像?
答案 0 :(得分:0)
而不是从处理线程中提取数据,看看是否有可能在帧更新时从UI线程推送数据 - 这样,你可以可能避免锁定;如果您可以创建图像数据的克隆,则可以避免在线程之间共享对象。
你真的只应该从主线程调用UI控件上的方法(Control.BeginInvoke()存在,但如果可能的话,最好尝试修改你的设计以避免它。)