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

时间:2019-07-19 22:09:52

标签: c# uwp garbage-collection finalizer

我在单例类中有一个MediaPlayer实例。类是通过自动事实作为单例实例注入到消费者的。

public class SMTCControl 
{
    private MediaPlayer mediaPlayer;

    ~SMTCControl ()
    {
        coreDispatcher.TryRunAsync(CoreDispatcherPriority.Normal, ()=>
        {
            mediaPlayer.Dispose();
            mediaPlayer = null;
        });
    }

    public SMTCControl ()
    {
        coreDispatcher.TryRunAsync(CoreDispatcherPriority.Normal, ()=>
        {
            mediaPlayer = new MediaPlayer();
        });            
    }

    public IMediaPlaybackSource Source
    {
        get => mediaPlayer.Source;
        set => mediaPlayer.Source = value;
    }

    public MediaPlaybackCommandManager CommandManager => mediaPlayer.CommandManager;

    public SystemMediaTransportControls SystemMediaTransportControls => 
        mediaPlayer.SystemMediaTransportControls;
}

SMTC有一个错误,即如果我创建并处理UI线程以外的其他问题,则会泄漏内存。

所以我用coreDispatcher.TryRunAsync(CoreDispatcherPriority.Normal, handler);来初始化和配置媒体播放器。

如果我在终结器中使用coreDispatcher.TryRunAsync(CoreDispatcherPriority.Normal, handler);来放置对象,则它将导致新任务在UI线程中排队,但是类的终结器已退出调用,因为TryRunAsync将运行到其他线程中。

我的问题是:

  1. 实际上在哪个线程上调用了终结器。我听说它是​​UI消息循环,和UI线程一样吗?断点不会对终结器代码造成打击。
  2. 由于单例将在用户退出应用程序时被处置,因此真的需要处置对象吗?如果没有应用程序在运行,则意味着没有内存需要清理。

0 个答案:

没有答案