私は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()
が呼び出されます。これまでのところうまく動作します! Now:
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
function()内でonDataReceive()
が呼び出されることがあります。 私はまた、thrashOldCamera()
をトリガーするフォームにボタンを追加しました。これは完全に機能します。
本当にありがとうございます。
http://channel9.msdn.com/Series/-NET-Debugging-Stater-Kit-for-the-Production-Environment/Diagnosing-Application-Issues-01 –