同时访问2个线程上的对象

时间:2011-05-07 09:14:18

标签: c# multithreading thread-safety

我有一个拥有2个线程的c#应用程序。一个线程正在创建一个对象,而在第二个线程中使用相同的对象。大部分时间它工作正常,但有一段时间它给出错误Object is in use currently elsewhere.

如何让线程同时使用对象?

由于

修改

我正在访问Bitmap个对象。一个线程是从流创建这个位图,在PictureBox上显示它,第二个线程再次将此Bitmap转换为Byte并在网络上传输它。

4 个答案:

答案 0 :(得分:2)

您的基本方法是锁定对象(与共享对象的1-1关系)和lock语句:

MyObject shared = ...;
object locker = new object();

// thread A
lock(locker)
{
  // use 'shared'
}

// thread B
lock(locker)
{
  // use 'shared'
}

编辑后

如果要以任何方式转换位图,最好不要忘记并行。这是一个复杂的类,有自己的内部锁定。

如果您不转换,请不要使用位图。为PictureBox和传出流分叉传入流将更容易(不是微不足道)。

答案 1 :(得分:2)

错误消息的语言使它听起来像来自GDI子系统或类似的东西。这是一个GUI应用程序吗?如果是,最可能的原因是您正在从“非GUI”线程访问GUI元素。对于没有经验的人来说,任何GUI控件上的所有操作,如表单或按钮,都必须通过它的消息泵发送给它。你可以粗略地做到这一点

if (form.InvokeRequired)
{
    form.BeginInvoke( your operation method);
} 
else
{ 
    (same operation method);
} 

答案 2 :(得分:2)

  

我正在访问一个Bitmap对象。一个线程是从流创建这个位图,在PictureBox上显示它,第二个线程再次将此Bitmap转换为Byte并在网络上传输

从多个线程访问Bitmap对象不会导致InvalidOperationException。如果您同时编写和读取同一个实例,它可能会破坏您的数据,但据我所知Bitmap并未强加特定的线程模型。另一方面,PictureBox会这样做,因此我怀疑您正在尝试从非GUI工作线程读取或写回PictureBox实例。

答案 3 :(得分:1)

每当其中一个线程使用此变量时,您需要lock

因此:

object mylock;

lock(mylock)
{
//do someething with object
}//lock scope finishes here

其中mylock由访问此特定变量的每个锁使用。