如何在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,我认为它会为每个帧创建线程并调用这个线程。帮助我保存传入帧

如何在dll中使用c#锁定对象

与其使用愚蠢的固定数组类型解决方案,为什么不使用ConcurrentQueue?这样你就不用处理线程了,因为这是一个线程安全的类。让一个线程从队列的头部提取帧并写入它们,并让另一个线程添加。