我有一个拥有2个线程的c#应用程序。一个线程正在创建一个对象,而在第二个线程中使用相同的对象。大部分时间它工作正常,但有一段时间它给出错误Object is in use currently elsewhere.
如何让线程同时使用对象?
由于
修改
我正在访问Bitmap
个对象。一个线程是从流创建这个位图,在PictureBox
上显示它,第二个线程再次将此Bitmap
转换为Byte
并在网络上传输它。
答案 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
由访问此特定变量的每个锁使用。