如何在dll中使用c#锁定对象
本文关键字:锁定 对象 dll | 更新日期: 2023-09-27 18:04:23
我有一个I/p相机和一个重复和接收每帧的函数。
public Bitmap ProcessFrame(Bitmap frame)
{
}
这是我缓冲最后100位图的缓冲位置:
lock (writer)
{
BM[now] = new Bitmap(frame);
now = (now == 99) ? 0 : now + 1;
}
当我按record录制视频时,我需要保存每个缓冲位图,然后我必须保存按record后接收到的传入位图。因此,当我按下记录并使用下面的代码将缓冲位图保存到视频文件时,我丢失了一些传入帧。在处理这一节时,传入帧被丢弃,我不想丢弃它们。
lock (writer)
{
for (int i = now; i < 150; i++)
{
if (BM[i] == null)
break;
writer.WriteVideoFrame(BM[i]);//adding frame to an existing open file
}
if (now != 0)
{
for (int i = 0; i < now - 1; i++)
{
writer.WriteVideoFrame(BM[i]);//adding frame to an existing open file
}
}
}
这里是传入帧保存到视频文件
的部分 lock (writer)
{
writer.WriteVideoFrame(frame);//adding frame to an existing open file
}
我已经找过了,发现那把锁对我有用。当保存缓冲位图锁时,将锁定写入器,因此另一个已经到来的位图将在写入器处停止并等待解锁,但它没有帮助。
我该怎么办?我怎样才能做一根安全的线?我正在使用开源的ispy,我认为它会为每个帧创建线程并调用这个线程。帮助我保存传入帧
与其使用愚蠢的固定数组类型解决方案,为什么不使用ConcurrentQueue?这样你就不用处理线程了,因为这是一个线程安全的类。让一个线程从队列的头部提取帧并写入它们,并让另一个线程添加。