同时访问2个线程上的对象
我有一个拥有2个线程的c#应用程序。 一个线程正在创建一个对象,而在第二个线程中使用相同的对象。 大部分时间它工作正常,但它给出了一些时间和错误Object is in use currently elsewhere.
如何让线程同时使用对象?
谢谢
编辑
我正在访问一个Bitmap
对象。 一个线程是从流创建这个位图,在PictureBox
上显示它,第二个线程再次将此Bitmap
转换为Byte
并在网络上传输它。
您的基本方法是锁定对象(与共享对象的1-1关系)和lock
语句:
MyObject shared = ...; object locker = new object(); // thread A lock(locker) { // use 'shared' } // thread B lock(locker) { // use 'shared' }
编辑后
如果您以任何方式转换位图,最好忘记并行。 这是一个复杂的类,有自己的内部锁定。
如果不进行转换,则不要使用位图。 为PictureBox和传出流分叉传入流将更容易(不是微不足道)。
错误消息的语言使它听起来像来自GDI子系统或类似的东西。 这是一个GUI应用程序吗? 如果是,最可能的原因是您正在从“非GUI”线程访问GUI元素。 对于初学者来说,任何GUI控件上的所有操作(如表单或按钮)都必须通过它的消息泵发送给它。 你可以粗略地做到这一点
if (form.InvokeRequired) { form.BeginInvoke( your operation method); } else { (same operation method); }
我正在访问一个Bitmap对象。 一个线程是从流创建这个位图,在PictureBox上显示它,第二个线程再次将此Bitmap转换为Byte并在网络上传输
从多个线程访问Bitmap
对象不会导致InvalidOperationException
。 如果您同时编写和读取同一个实例,它可能会破坏您的数据,但据我所知, Bitmap
不会强制使用特定的线程模型。 另一方面, PictureBox
有,所以我怀疑你是试图从非GUI工作线程读取或写回PictureBox
实例。
每次其中一个线程使用它时,您需要lock
此变量。
因此:
object mylock; lock(mylock) { //do someething with object }//lock scope finishes here
其中mylock
被访问此特定变量的每个锁使用。