Tôi đang làm việc trên một dự án iOS với C#. Chương trình sẽ chụp ảnh từ một webcam được kết nối và gửi nó qua Socket tới iPhone/iPad. Điều này tất cả hoạt động tốt và tôi có thể thành công có được dòng của tôi hiển thị trên thiết bị.Chương trình bị treo sau khi gọi Dispose()
Nhưng khi khách hàng ngắt kết nối, webcam phải tắt và trong chức năng này, chương trình sẽ bị treo. Không có thông báo lỗi và không có cuộc gọi ngoại lệ ... chỉ bị treo! Tôi tin rằng đó là một vấn đề với nhiều chủ đề nhưng tiếc là tôi không phải là kinh nghiệm trong C# để tìm một giải pháp. Tôi hy vọng ai đó ở đây có thể mang lại cho tôi đi đúng hướng ...
Code:
chức năng 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();
}
Defined như thế này trong Máy ảnh Class:
public event EventHandler<CameraEventArgs> OnImageCaptured;
Và kích hoạt:
OnImageCaptured.Invoke(this, new CameraEventArgs(bitmap, fps));
Vì vậy, chức năng này - những gì tôi tin - chạy trong một mối đe dọa riêng từ giao diện người dùng không bị chặn khi những hình ảnh đang đến trong
Vì vậy, hôm sau ngắt kết nối khách hàng được xử lý trong hàm này:.
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();
}
}
ngắt kết nối Client, thrashOldCamera()
được gọi. Hoạt động tốt cho đến nay! Bây giờ:
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");
}
Chương trình bị treo tại _frameSource.Camera.Dispose();
. Như đã nêu ở trên, không có lỗi hoặc ngoại lệ. Có thể là một vấn đề mà onDataReceive()
được gọi trong hàm onImageCapture
(). Tôi cũng đã thêm một nút vào biểu mẫu kích hoạt thrashOldCamera()
và điều này hoạt động hoàn hảo.
Bất kỳ trợ giúp/gợi ý nào thực sự được đánh giá cao.
http://channel9.msdn.com/Series/-NET-Debugging-Stater-Kit-for-the-Production-Environment/Diagnosing-Application-Issues-01 –