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

本文关键字:对象 线程 访问 | 更新日期: 2023-09-27 17:55:08

我有一个拥有 2 个线程的 c# 应用程序。一个线程正在创建对象,而另一个线程正在使用相同的对象。大多数时候它工作正常,但有时它会给出错误Object is in use currently elsewhere.

如何使线程能够同时使用对象?

谢谢

编辑

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

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

您的基本方法是锁定对象(与共享对象处于 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);
} 

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

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

每次由任一

线程使用它时,都需要lock此变量。

因此:

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

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