Ich arbeite an einem iOS-Projekt mit C#. Das Programm nimmt Bilder von einer angeschlossenen Webcam auf und sendet sie per Socket an das iPhone/iPad. Das alles funktioniert einwandfrei und ich kann meinen Stream erfolgreich auf dem Gerät anzeigen lassen.Programm hängt nach dem Aufruf von Dispose()
Aber wenn der Client die Verbindung trennt, muss die Webcam ausgeschaltet werden und in dieser Funktion legt das Programm einfach auf. Keine Fehlermeldungen und keine Ausnahmerufe ... hängt einfach! Ich glaube, es ist ein Problem mit mehreren Threads, aber leider bin ich nicht so erfahren in C#, um eine Lösung zu finden. Ich hoffe, dass hier jemand mich auf dem richtigen Weg bringen ...
Code:
onImageCaptured Funktion:
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();
}
definiert wie diese in der Kamera Klasse:
public event EventHandler<CameraEventArgs> OnImageCaptured;
Und ausgelöst:
OnImageCaptured.Invoke(this, new CameraEventArgs(bitmap, fps));
Also diese Funktion - was ich glaube - läuft in einer separaten Bedrohung dar, da die Benutzeroberfläche wird nicht blockiert, wenn die Bilder in kommen
Also die nächsten die Client Trennung in dieser Funktion behandelt wird.
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();
}
}
Client die Verbindung trennt, wird thrashOldCamera()
genannt. Funktioniert soweit gut! Jetzt:
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");
}
Das Programm hängt an _frameSource.Camera.Dispose();
. Wie oben erwähnt, gibt es keinen Fehler oder eine Ausnahme. Es kann ein Problem sein, dass onDataReceive()
innerhalb der onImageCapture
-Funktion() aufgerufen wird. Ich habe auch eine Schaltfläche zum Formular hinzugefügt, die thrashOldCamera()
auslöst und das funktioniert perfekt.
Jede Hilfe/Hinweise werden wirklich geschätzt.
http://channel9.msdn.com/Series/-NET-Debugging-Stater-Kit-for-the-Production-Environment/Diagnosing-Application-Issues-01 –