C# UWP/C在哪个线程上调用终结器#

C# UWP/C在哪个线程上调用终结器#,c#,uwp,garbage-collection,finalizer,C#,Uwp,Garbage Collection,Finalizer,我在singleton类中有一个MediaPlayer实例。类作为单例实例通过autofact注入消费者 公共类SMTCControl { 私人媒体播放器; ~SMTCControl() { corespatcher.TryRunAsync(corespatcherpriority.Normal,()=> { mediaPlayer.Dispose(); mediaPlayer=null; }); } 公共SMTCControl() { corespatcher.TryRunAsync(core

我在singleton类中有一个MediaPlayer实例。类作为单例实例通过autofact注入消费者

公共类SMTCControl
{
私人媒体播放器;
~SMTCControl()
{
corespatcher.TryRunAsync(corespatcherpriority.Normal,()=>
{
mediaPlayer.Dispose();
mediaPlayer=null;
});
}
公共SMTCControl()
{
corespatcher.TryRunAsync(corespatcherpriority.Normal,()=>
{
mediaPlayer=新的mediaPlayer();
});            
}
公共IMediplayBacksource源
{
get=>mediaPlayer.Source;
set=>mediaPlayer.Source=value;
}
public MediaPlaybackCommandManager CommandManager=>mediaPlayer.CommandManager;
公共系统MediaTransportControls SystemMediaTransportControls=>
mediaPlayer.SystemMediaTransportControls;
}
SMTC有一个bug,如果我创建并处理这个非UI线程,它会泄漏内存

所以我使用了
corespatcher.TryRunAsync(corespatcherpriority.Normal,handler)
初始化并释放mediaplayer

如果我使用
corespatcher.TryRunAsync(corespatcherpriority.Normal,handler)
在终结器中处置对象,然后它会导致新任务在UI线程中排队,但类的终结器已退出调用,因为TryRunAsync将运行到不同的线程

我的问题是:

  • 在哪个线程上实际调用终结器。我听说它是UI消息循环,和UI线程一样吗?终结器代码上没有断点
  • 由于当用户退出应用程序时,singleton将获得dispose,因此是否确实需要处置对象?如果没有应用程序运行,则意味着没有内存需要清理

  • 相关:一个要点是,您不能总是依赖于在程序结束时运行的垃圾收集器。NET5是.NETCore的成功者,与.NETFramework不同,它可能不会继续这样做。随着Windows特定的UI技术在.NET Core上得到支持,这可能也会与UWP相关。相关:一个好处是,您不能总是依赖程序末尾运行的垃圾收集器。NET5是.NETCore的成功者,与.NETFramework不同,它可能不会继续这样做。随着特定于Windows的UI技术在.NET Core上得到支持,这也可能与UWP相关。