Утечка памяти на UWP MediaPlayer (Windows.Media.Playback.MediaPlayer) - PullRequest
0 голосов
/ 16 февраля 2019

Я поддерживаю приложение WPF.Я добавил UWP nedia player в свой проект.Но использование памяти слишком высоко.Я понял, что это сделал медиаплеер UWP, и создал воспроизводимый код.

while (true)
{
    var mp = new MediaPlayer()
    {
        Source = MediaSource.CreateFromUri(new Uri("Test.mp4"))
    };
    Thread.Sleep(1000);
    mp.Play();
    Thread.Sleep(1000);
    mp.Dispose();
}

В этом коде возникает утечка памяти.Я создал MediaPlayer и избавился от него!Но его использование памяти растет бесконечно.

Как я могу обнаружить утечку памяти в этом коде?

Это проект .NET Core 3.0.(XAML-острова с WPF) Я еще не проверял, если это происходит в чистом проекте UWP.

Кто-то говорит, что это естественно, потому что это цикл.Но приведенный ниже код не приводит к утечке памяти, потому что GC работает.(Конечно, некоторые (но ограничительные) ссылки не будут собраны.)

while (true)
{
    new SomeClass();
}

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Это абсолютно баг Windows 10 19H1.Потому что встроенное приложение (Кино и ТВ) имеет ту же проблему утечки памяти.Чтобы воспроизвести это, просто повторите этот открытый видеофайл и закройте его.

0 голосов
/ 17 февраля 2019

То, как пишется ваш код, будет увеличиваться и увеличиваться до тех пор, пока у вас не закончится память.Я проверил также в чистом UWP.Если вы сделаете следующие два изменения, вы обнаружите, что память останется стабильной, и система будет восстанавливать всю память после каждого цикла:

  1. Утилизируйте также объект MediaSource, который вы создаете, и присвойте свойству Source
  2. Не выполняйте это в узком цикле, вместо этого вызовите себя в качестве действия диспетчера

Вот код (протестированный в UWP), который не показывает утечки.В WPF вызов Dispatcher будет выглядеть немного по-другому:

private async void PlayMedia()
{
    var ms = MediaSource.CreateFromUri(new Uri("ms-appx:///Media1.mp4"));
    var mp = new MediaPlayer()
    {
        Source = ms
    };
    Thread.Sleep(1000);
    mp.Play();
    Thread.Sleep(1000);
    mp.Dispose();
    ms.Dispose();

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(PlayMedia));
}

В качестве примечания: упомянутое вами сравнение SomeClass - это не совсем сравнение яблок и яблок, если SomeClass является чисто управляемым кодом.класс, так как объекты, которые вы создаете здесь, являются сложными собственными объектами среды выполнения Windows, которые имеют только тонкую оболочку управляемого кода.

Протестировано также сейчас в WPF: я воспроизвел исходную проблему роста памяти, затем применил предложенныйизменения и проверил, что память больше не растет.Вот мой тестовый проект для справки: https://1drv.ms/u/s!AovTwKUMywTNuLk9p3frvE-U37saSw

Также я запустил ваше общее решение с приложением WPF, упакованным в пакет приложений для Windows, и я не вижу утечки в последней выпущенной версииверсия Windows 10 (17763.316).Ниже приведен скриншот диагностики памяти после долгого запуска вашего решения.Если это относится к инсайдерской сборке, которую вы используете, зарегистрируйте ошибку через Feedback Hub.Я думаю, что на данный момент мы должны закрыть этот вопрос как ответ.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...