То, как пишется ваш код, будет увеличиваться и увеличиваться до тех пор, пока у вас не закончится память.Я проверил также в чистом UWP.Если вы сделаете следующие два изменения, вы обнаружите, что память останется стабильной, и система будет восстанавливать всю память после каждого цикла:
- Утилизируйте также объект MediaSource, который вы создаете, и присвойте свойству Source
- Не выполняйте это в узком цикле, вместо этого вызовите себя в качестве действия диспетчера
Вот код (протестированный в 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.Я думаю, что на данный момент мы должны закрыть этот вопрос как ответ.