同时访问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被访问此特定变量的每个锁使用。