内存访问冲突从任务中处理 libvlcsharp 对象
Memory Access Violation disposing libvlcsharp objects from a task
Link to full sample app
C# Winform 应用内置 Visual Studio 2019 libvlcsharp runtime version v4.0.30319 version 3.4.4.0
我构建了一个更简单的应用程序,它与当前部署的应用程序存在相同的问题。
这是让玩家开始的代码:
videoView1.MediaPlayer.Play(new Media(_libVLC, URI,FromType.FromLocation));
这是清理代码片段:
videoView1.MediaPlayer.Stop();
videoView1.MediaPlayer.Dispose();
videoView1.Dispose();
//dispose glibvlc at higher level
MediaPlayer 处理正常,没有错误。但是,videoview dispose 会导致内存访问冲突。我知道这不正常,因为我构建了一个简单的 C# 应用程序,但没有使用任务来处理和清理对象,而且工作得很好。
但是,我尝试调试的应用程序的每个流都有一个线程显示,用于管理每个连接的设置和关闭。
如果代码只是在媒体播放器上调用处置而不处置 videoview 对象,则包含 libvlcsharp 对象的对象在处置时会导致内存访问冲突。
如果我不处理 MediaPlayer 对象,任何后续对象处理调用都可以正常工作。
我已经确认这会泄漏内存。
在UIclass
设置所有表单变量。
实例化 LibVLC
开始视频();这以 Play 方法结束
Task.Run(() => 问());这模拟了可能发生的情况
真正的应用程序
Ask 函数询问用户是否要退出程序或杀死当前播放器并重新构建和启动它。
- 如果用户取消它通过 On Application Exit 处理程序退出
does 执行上面显示的 Dispose 序列。这按设计工作。
- 如果用户终止并重新启动,则 videoView1 处理失败
如上所述。
这是 c# 示例询问函数。
public void Ask()
{
while (true)
{
DialogResult r = MessageBox.Show("Dispose and Start Again?", "Memory Access Violation Test", MessageBoxButtons.OKCancel);
if (r == DialogResult.OK)
{
videoView1.MediaPlayer.Stop();
videoView1.MediaPlayer.Dispose();
videoView1.Dispose();
StartVideo();
}
else
{
Invoke(new Action(() => this.Close()));
}
}
}
要修复 libvlcsharp 和 libvlcwinforms.winforms
升级到版本 3.6.1.0 的问题
Link to full sample app C# Winform 应用内置 Visual Studio 2019 libvlcsharp runtime version v4.0.30319 version 3.4.4.0
我构建了一个更简单的应用程序,它与当前部署的应用程序存在相同的问题。
这是让玩家开始的代码:
videoView1.MediaPlayer.Play(new Media(_libVLC, URI,FromType.FromLocation));
这是清理代码片段:
videoView1.MediaPlayer.Stop();
videoView1.MediaPlayer.Dispose();
videoView1.Dispose();
//dispose glibvlc at higher level
MediaPlayer 处理正常,没有错误。但是,videoview dispose 会导致内存访问冲突。我知道这不正常,因为我构建了一个简单的 C# 应用程序,但没有使用任务来处理和清理对象,而且工作得很好。
但是,我尝试调试的应用程序的每个流都有一个线程显示,用于管理每个连接的设置和关闭。
如果代码只是在媒体播放器上调用处置而不处置 videoview 对象,则包含 libvlcsharp 对象的对象在处置时会导致内存访问冲突。
如果我不处理 MediaPlayer 对象,任何后续对象处理调用都可以正常工作。 我已经确认这会泄漏内存。
在UIclass
设置所有表单变量。
实例化 LibVLC
开始视频();这以 Play 方法结束
Task.Run(() => 问());这模拟了可能发生的情况 真正的应用程序
Ask 函数询问用户是否要退出程序或杀死当前播放器并重新构建和启动它。
- 如果用户取消它通过 On Application Exit 处理程序退出 does 执行上面显示的 Dispose 序列。这按设计工作。
- 如果用户终止并重新启动,则 videoView1 处理失败 如上所述。
这是 c# 示例询问函数。
public void Ask()
{
while (true)
{
DialogResult r = MessageBox.Show("Dispose and Start Again?", "Memory Access Violation Test", MessageBoxButtons.OKCancel);
if (r == DialogResult.OK)
{
videoView1.MediaPlayer.Stop();
videoView1.MediaPlayer.Dispose();
videoView1.Dispose();
StartVideo();
}
else
{
Invoke(new Action(() => this.Close()));
}
}
}
要修复 libvlcsharp 和 libvlcwinforms.winforms
升级到版本 3.6.1.0 的问题