C#으로 iOS 프로젝트에서 작업하고 있습니다. 이 프로그램은 연결된 웹캠에서 이미지를 캡처하여 소켓을 통해 iPhone/iPad로 보냅니다. 이 모든 것은 정상적으로 작동하며 장치에서 스트림을 성공적으로 보여줄 수 있습니다.Dispose()를 호출 한 후 프로그램이 중단됩니다.
그러나 클라이언트가 연결을 끊으면 웹캠이 꺼져 야하며이 기능에서는 프로그램이 멈 춥니 다. 오류 메시지도없고 예외 호출도 없습니다 ... 그냥 멈 춥니 다! 여러 스레드에서 문제가 있다고 생각하지만 유감스럽게도 솔루션을 찾기 위해 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();
에 있습니다. 위에서 언급했듯이 오류나 예외는 없습니다. onImageCapture
함수() 내에서 onDataReceive()
이 호출되는 것이 문제 일 수 있습니다. 또한 thrashOldCamera()
을 트리거하는 폼에 버튼을 추가했는데 완벽하게 작동합니다.
어떤 도움이나 힌트라도 진심으로 감사드립니다.
http://channel9.msdn.com/Series/-NET-Debugging-Stater-Kit-for-the-Production-Environment/Diagnosing-Application-Issues-01 –