Win10 IoT下WPF MediaElement运行一周后无法显示的问题求助
Win10 IoT 1906上WPF MediaElement运行一周后无画面(重启应用无效,仅系统重启恢复)
问题描述
基于C# .NET 6 WPF开发的自助服务终端软件,部署在Win10 1906 IoT设备(开发环境VS2022)。主界面通过MediaElement动态加载本地.mp4文件,初期运行正常,但一周后MediaElement突然停止显示画面,无任何异常抛出,应用其余代码仍正常执行。重启应用无法恢复,仅重启Windows可临时解决,但问题会在一周后复现。应用内存始终稳定在500MB左右,推测为系统层面问题,但无从入手。
相关代码片段:
媒体加载代码
case 3: myImagePoettinger.Source = new Uri(@"Graphics\door_open.mp4", UriKind.Relative); repeatVideo = false; break; case 4: myImagePoettinger.Source = new Uri(@"Graphics\insertion.mp4", UriKind.Relative); repeatVideo = false; break; case 5: myImagePoettinger.Source = new Uri(@"Graphics\Start_2.mp4", UriKind.Relative); repeatVideo = false; break; case 6: myImagePoettinger.Source = new Uri(@"Graphics\door_close.mp4", UriKind.Relative); repeatVideo = false; break; case 7: myImagePoettinger.Source = new Uri(@"Graphics\hydraulic.mp4", UriKind.Relative); repeatVideo = true; break; case 8:
MediaEnded重播代码
void Media_Ended(object sender, EventArgs e) { if (repeatVideo) { myImagePoettinger.Position = TimeSpan.FromMilliseconds(1); } }
XAML中的MediaElement定义
<MediaElement x:Name="myImagePoettinger" Width="900" Height="600" Visibility="Visible"></MediaElement>
排查与解决方向
1. 系统媒体组件资源泄漏
Win10 IoT的媒体播放组件(如Windows Media Player相关服务)可能存在长期运行后的资源泄漏,重启应用无法释放系统级资源。
- 切换视频时显式清理旧资源:
// 切换前先释放当前资源 myImagePoettinger.Source = null; myImagePoettinger.Close(); // 再加载新视频 myImagePoettinger.Source = new Uri(@"Graphics\XXX.mp4", UriKind.Relative); - 定期重启媒体相关服务(需管理员权限):
Process.Start(new ProcessStartInfo { FileName = "net", Arguments = "stop WMPNetworkSvc && net start WMPNetworkSvc", UseShellExecute = true, Verb = "runas" });
2. 循环播放的状态异常积累
当前仅通过设置Position实现循环,可能导致媒体引擎内部状态异常堆积。
- 改为重新加载Source实现循环:
void Media_Ended(object sender, EventArgs e) { if (repeatVideo) { var currentSource = myImagePoettinger.Source; myImagePoettinger.Source = null; myImagePoettinger.Source = currentSource; } }
3. Win10 IoT 1906的已知媒体bug
Win10 1906属于较旧的IoT版本,可能存在媒体组件长期运行的bug:
- 尝试升级到Win10 IoT较新版本(如21H2及以上),修复已知系统级资源泄漏问题;
- 若无法升级,禁用硬件加速:
或在XAML中添加属性:RenderOptions.SetProcessRenderMode(myImagePoettinger, RenderMode.SoftwareOnly);<MediaElement x:Name="myImagePoettinger" Width="900" Height="600" Visibility="Visible" RenderOptions.ProcessRenderMode="SoftwareOnly"></MediaElement>
4. 系统资源监控与日志采集
- 新增日志跟踪
wmplayer.exe或MediaFoundation相关进程的内存、句柄数变化,确认是否存在资源持续增长; - 用Windows事件查看器筛选“Windows Media Foundation”相关错误日志,排查隐藏的系统级异常。
内容的提问来源于stack exchange,提问作者Stiegl22
相关产品推荐
相关产品推荐

