同时访问 2 个线程上的对象
本文关键字:对象 线程 访问 | 更新日期: 2023-09-27 17:55:08
我有一个拥有 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);
}
我正在访问位图对象。一个线程从流创建此位图,将其显示在 PictureBox 上,第二个线程再次将此位图转换为字节并在网络上传输
从多个线程访问Bitmap
对象不会导致InvalidOperationException
。如果您同时写入和读取相同的实例,它可能会破坏您的数据,但据我所知Bitmap
并没有强加特定的线程模型。另一方面,PictureBox
确实如此,因此我怀疑您正在尝试从非 GUI 工作线程读取或写回PictureBox
实例。
线程使用它时,都需要lock
此变量。
因此:
object mylock;
lock(mylock)
{
//do someething with object
}//lock scope finishes here
其中mylock
由访问此特定变量的每个锁使用。