我有一个xna游戏导出的dll文件。运行游戏的所有东西(除了内容)都在这个库中,特别是主游戏类。
在另一个程序集中,我加载游戏dll,实例化游戏类并在其上调用Run()。这将运行游戏。之后,当游戏结束时,我调用Dispose()来完全关闭游戏。加载dll的主程序仍在运行。
到目前为止,没有问题。
然而,当游戏使用带有MediaPlayer的Song时,似乎游戏并没有完全关闭。在游戏的内容目录中,有与歌曲对应的.xnb和.wma文件。尽管游戏不再运行,但我不能删除.wma文件,因为进程(我的主程序)仍然持有该文件的句柄。删除.xnb文件不会出现任何问题。
我发现游戏创建了一个额外的线程,该线程在游戏退出后不会关闭。我怀疑这个线程是一个仍然持有文件句柄的媒体播放器线程。有没有办法迫使xna放弃文件句柄?也许杀死额外的线程将是一个选择(尽管它不是很好),但如何做到这一点呢?
在MediaPlayer上调用Stop()不会更改此行为。
发布于 2012-08-12 11:59:49
通常,在创建XNA游戏时,一般做法是根本不使用MediaPlayer,而是使用Sound & SoundInstance替代方案。尽管它们可能使用不同的声音格式,但它们的性能更好,因为MediaPlayer非常庞大,而且在您的情况下,还存在线程问题。
我可能错了,但我认为MediaPlayer实际上将本地机器称为实际的MediaPlayer。这可能是为什么很难停止它的线程的原因之一。
这取决于您,但我会完全避免使用MediaPlayer。它被认为是对我的诅咒:
https://stackoverflow.com/questions/11209973
复制相似问题