如何从不同的线程访问对象而不会发生冲突?

时间:2011-11-04 03:49:41

标签: c# multithreading thread-safety

我有一个名为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线程访问图像?

1 个答案:

答案 0 :(得分:0)

而不是从处理线程中提取数据,看看是否有可能在帧更新时从UI线程推送数据 - 这样,你可以可能避免锁定;如果您可以创建图像数据的克隆,则可以避免在线程之间共享对象。

你真的只应该从主线程调用UI控件上的方法(Control.BeginInvoke()存在,但如果可能的话,最好尝试修改你的设计以避免它。)