Objekt im asynchronen Ereignis C# WPF entsorgenC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Objekt im asynchronen Ereignis C# WPF entsorgen

Post by Anonymous »

Ich verwende das Kinect SDK in einer WPF-Anwendung und warte auf das Ereignis DepthFrameReady, um einige Vorgänge auszuführen. Um eine Blockierung der Benutzeroberfläche zu vermeiden, habe ich das Ereignis asynchron gemacht und „warte“ auf die Funktion, die die Datenoperationen durchgeführt hat.
Im Moment im Ausgabefenster in Visual Studio, ich erhalte die Meldung:

WARNUNG: Eine imageFrame-Instanz wurde nicht entsorgt

Ich habe viele Dinge versucht, um den DepthImageFrame zu entsorgen (Put-Logik). innen mit Block, Rückruf, wenn die asynchrone Funktion endet usw.), aber nach dem ersten Aufruf wird Null gesendet, also...
Das ist die richtige Art der Entsorgung das Objekt in async/await Ereignissen?

Code: Select all

MyWindow.xaml.cs
:

Code: Select all

private async void KinectSensorFound_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
// as suggested in Zoran Answer
await Task.Run(() =>
{
using (DepthImageFrame DataDepthImageFrame = e.OpenDepthImageFrame())
{
UpdateUserDepthInfo(DataDepthImageFrame);
}

});
}

public void UpdateUserDepthInfo(DepthImageFrame DataDepthImage)
{
var TimeNow = DateTime.Now;

if ((DateTime.Now - PreviusTime).Milliseconds 
{
if (chckbxDepthImage.IsChecked == true)
{
chckbxColorImage.IsChecked = false;
// This method is called in my business logic to do a transformation with the frame
BitmapSource DepthBitMapSource = Controller.getInfoOfDepthUser(DataDepthImage);
DepthCanvas.Background = new ImageBrush(DepthBitMapSource);
}
else
{
DepthCanvas.Children.Clear();
DepthCanvas.Background = new SolidColorBrush(Colors.Transparent);
}

DepthUserInfo = Controller.DoGetInfoDepthUser(DataDepthImage);
lblDepthUser.Content = string.Format("{0:0.00} mts", DepthUserInfo / 1000);

}), DataDepthImage);
PreviousTime = TimeNow;
}

Code: Select all

KinectHelper.cs
:

Code: Select all

public BitmapSource getBitmapOfDepth(DepthImageFrame DataImageFrame)
{
DepthImagePixel[] ImageDepth = new DepthImagePixel[0];
int DepthDistance;
depthReturnStruct DepthReturn = new depthReturnStruct();

if (DataImageFrame != null)
{
ImageDepth = new DepthImagePixel[DataImageFrame.PixelDataLength];
DataImageFrame.CopyDepthImagePixelDataTo(ImageDepth); // exception here

//... other code
}

return bitmapDepth;
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post