WPF アプリケーションをシャットダウンすると、不可解な破棄されたオブジェクトの問題に直面しています。私の論理に間違いを見つけたら、指摘してください。
以下に示すように、メソッドを持つColorManager
クラスがあります。update()
public void Update(ColorImageFrame frame)
{
byte[] pixelData = new byte[frame.PixelDataLength];
frame.CopyPixelDataTo(pixelData);
if (Bitmap == null)
{
Bitmap = new WriteableBitmap(frame.Width,
frame.Height,
96,
96,
PixelFormats.Bgr32,
null);
}
// draw bitmap
RaisePropertyChanged(() => Bitmap);
}
このメソッドは別のスレッドで実行します。私のMainWindow.xaml.cs
中で私は次のものを持っています:
private void Initialise()
{
if (kinectSensor == null)
return;
// start kinect sensor
kinectSensor.Start();
updateColourStreamThread = new Thread(new ThreadStart(colorStreamDisplay));
updateColourStreamThread.Name = "updateColourStreamThread";
updateColourStreamThread.Start();
// ...some more codes
}
void colorStreamDisplay()
{
while(isDisplayActive)
{
using (var frame = kinectSensor.ColorStream.OpenNextFrame(500))
{
if (frame == null) continue;
if (displayDepthStream) continue;
Dispatcher.Invoke(new Action(() => colorManager.Update(frame)));
}
}
}
MainWindow.xaml.cs
閉じるボタンをクリックした後にクリーンアップを行うには、次の方法があります。
private void Clean()
{
isDisplayActive = false;
// some other codes
if (kinectSensor != null)
{
updateColourStreamThread.Abort();
updateDepthStreamThread.Abort();
updateSkeletonStreamThread.Abort();
kinectSensor.Stop();
kinectSensor = null;
Console.WriteLine("Closed successfully");
}
frame.CopyPixelDataTo(pixelData);
閉じるボタンをクリックすると、アプリケーションが「破棄されたオブジェクトにアクセスできません」をスローします。
bool 値を false に切り替えてループを停止してから、スレッドを中止し、kinect デバイスを停止します。
私は何を取りこぼしたか?