Objekt im asynchronen Ereignis C# WPF entsorgen

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Objekt im asynchronen Ereignis C# WPF entsorgen

by Anonymous » 29 Dec 2024, 12:10

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;
}

Top