Estoy trabajando en un proyecto de iOS con C#. El programa captura imágenes de una cámara web conectada y las envía a través de Socket al iPhone/iPad. Todo esto funciona bien y puedo hacer que mi transmisión se muestre correctamente en el dispositivo.El programa se cuelga después de llamar a Dispose()
Pero cuando el cliente se desconecta, la cámara web tiene que apagarse y en esta función, el programa simplemente cuelga. No hay mensajes de error ni llamadas de excepción ... ¡simplemente se cuelga! Creo que es un problema con varios subprocesos, pero desafortunadamente no tengo tanta experiencia en C# para encontrar una solución. Espero que alguien aquí me puede llevar en el camino correcto ...
Código:
función 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();
}
Definido como esta en la cámara Clase:
public event EventHandler<CameraEventArgs> OnImageCaptured;
y provocó:
OnImageCaptured.Invoke(this, new CameraEventArgs(bitmap, fps));
Así que esta función - lo que creo - se ejecuta en una amenaza por separado ya que la interfaz de usuario no se bloquean cuando las imágenes están llegando
Así que la próxima desconexión del cliente se maneja en esta función:.
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();
}
}
cliente se desconecta, thrashOldCamera()
se llama. ¡Funciona bien hasta ahora! Ahora:
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");
}
El programa se cuelga en _frameSource.Camera.Dispose();
. Como se indicó anteriormente, no hay error o excepción. Puede ser un problema que se llame a onDataReceive()
dentro de la función onImageCapture
(). También agregué un botón al formulario que desencadena thrashOldCamera()
y esto funciona perfectamente.
Cualquier ayuda/sugerencias son realmente apreciadas.
http://channel9.msdn.com/Series/-NET-Debugging-Stater-Kit-for-the-Production-Environment/Diagnosing-Application-Issues-01 –