2017-06-04 54 views
0

我推送帧到队列,然后使用另一个线程来处理它,但始终运行在“推帧线程”。如何处理队列?

VideoSource.NewFrame += VideoSource_NewFrame; 
private void VideoSource_NewFrame(object sender, NewFrameEventArgs eventArgs) 
{ 
    var bitmap = (Bitmap)eventArgs.Frame; 
    if (_fileWriter.IsOpen&&IsRecording) 
    { 
     _bitmaps.Enqueue(bitmap); 
     //Thread.Sleep(10); 
    } 
} 

但如果我处理Thread.Sleep(10),另一个线程将工作。

另一个线程代码:

new Task(() => 
{ 
    Bitmap bitmap = null; 
    while (IsRecording==true) 
    { 
     if (_bitmaps.Count == 0) 
      continue; 
     _bitmaps.TryDequeue(out bitmap); 
     if(bitmap!=null&& _fileWriter.IsOpen) 
      _fileWriter.WriteVideoFrame(bitmap); 
     if (_bitmaps.Count == 0 && IsRecording == false&&_fileWriter.IsOpen) 
     { 
      _fileWriter.Flush(); 
      _fileWriter.Close(); 
     } 
    } 
}).Start(); 

如何用更优雅的方式处理呢?

+0

你是什么意思的“始终运行在推框架线程”? –

+0

@Kevin Gosse:任务中的“while循环代码”将不会再执行三次,但计数不为零。 – HaibaraAi

+0

你为什么用构造函数创建'Task'?这是一个不好的做法。 – VMAtm

回答

0

我只是将代码更改为此。 它的工作...

var bitmap = (Bitmap)eventArgs.Frame.Clone();