Удаление объекта в асинхронном событии C# WPFC#

Место общения программистов C#
Ответить
Anonymous
 Удаление объекта в асинхронном событии C# WPF

Сообщение Anonymous »

Я использую Kinect SDK в приложении WPF и слушаю событие DepthFrameReady, чтобы выполнить некоторые операции. Чтобы избежать блокировки пользовательского интерфейса, я сделал событие асинхронным и «ожидаю» функции, выполняющей операции с данными.
Сейчас в окне вывода в Visual Studio, я получаю сообщение:

ВНИМАНИЕ: экземпляр imageFrame не был удален

Я пробовал много способов избавиться от DepthImageFrame (поместите логику внутрь с помощью block, обратного вызова при завершении асинхронной функции и т. д.), но после первого вызова он отправляет ноль, поэтому...
Как правильно разместить объект в событиях async/await?
MyWindow.xaml.cs:
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;
}

KinectHelper.cs:
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;
}


Подробнее здесь: https://stackoverflow.com/questions/472 ... -sharp-wpf
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»