我正在开发一个使用C#的iOS项目。该程序从连接的网络摄像头中捕获图像,并通过Socket将其发送到iPhone/iPad。这一切都运行良好,我可以成功地在设备上获取我的流。
但是当客户端断开连接时,网络摄像头必须关闭,在此功能中,程序就会卡住。没有错误消息和异常调用...只是卡住了!我认为这是多线程问题,但不幸的是我在C#方面经验不足,无法找到解决方案。我希望这里有人能把我引到正确的轨道上...
代码:
onImageCaptured函数:
public void OnImageCaptured(Touchless.Vision.Contracts.IFrameSource frameSource, Touchless.Vision.Contracts.Frame frame, double fps)
{
_latestFrame = frame.Image;
Console.WriteLine("OnImageCaptured");
if (isConnected)
{
Console.WriteLine("OnImageCaptured - isConnected");
byteArray = new byte[0];
MemoryStream stream = new MemoryStream();
_latestFrame.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
stream.Close();
byteArray = stream.ToArray();
if (byteArray.Length > 0)
{
string eof = "<EOF>";
byte[] eofByte = Encoding.ASCII.GetBytes(eof);
Console.WriteLine("OnImageCaptured - sendStream");
this.onDataSend(byteArray);
this.onDataSend(eofByte);
stream.Flush();
}
System.Diagnostics.Debugger.Log(0, "1", "\nByte Array Length: " + byteArray.Length.ToString());
}
pictureBoxDisplay.Invalidate();
}
在相机类中定义如下:
public event EventHandler<CameraEventArgs> OnImageCaptured;
并触发:
OnImageCaptured.Invoke(this, new CameraEventArgs(bitmap, fps));
我相信这个函数是在单独的线程中运行的,因为当图像加载时UI不会被阻塞。
接下来,客户端断开连接是在此函数中处理的:
public void onDataSend(byte[] data)
{
clientReady = false;
try
{
socketWorker.Send(data);
}
catch (SocketException se)
{
isConnected = false;
Console.WriteLine("Error: Data Write - SocketException");
Console.WriteLine(se.ErrorCode.ToString());
thrashOldCamera() // THIS FUNCTION HANGS THE PROGRAM !!
onDisconnectServer();
// onDisconnectServer();
}
catch (ObjectDisposedException)
{
isConnected = false;
Console.WriteLine("Error: Data Write - ObjectDisposedException");
// onDisconnectServer();
}
}
客户端断开连接,调用
thrashOldCamera()
函数。到目前为止都正常!现在:private void thrashOldCamera()
{
Console.WriteLine("TrashOldCamera");
// Trash the old camera
if (_frameSource != null)
{
try
{
_frameSource.NewFrame -= OnImageCaptured;
Console.WriteLine("TrashOldCamera - 1");
_frameSource.Camera.Dispose(); // HERE IT HANGS. IT NEVER GOES PAST HERE !!!
Console.WriteLine("TrashOldCamera - 2");
setFrameSource(null);
Console.WriteLine("TrashOldCamera - 3");
pictureBoxDisplay.Paint -= new PaintEventHandler(drawLatestImage);
}
catch (Exception ex)
{
Console.WriteLine("End Trash Camera Ex: " + ex);
}
}
Console.WriteLine("End Trash Camera");
}
程序在_frameSource.Camera.Dispose();
处停止响应。如上所述,没有错误或异常。
onDataReceive()
可能在onImageCapture()
函数内被调用,这可能是一个问题。
我还向表单添加了一个按钮来触发thrashOldCamera()
,这个功能完美地运行。
非常感谢您的帮助和提示。