一段时间后过期单例实例

Jas*_*son 2 c# singleton design-patterns

暂时搁置关于单例模式的相对优点和缺点的争论,考虑到单例通常被认为是在应用程序的生命周期内持续存在的实例,那么最好的方法是什么?生命有限的单身人士?

以下内容是否有任何问题:

public class CategoryHandler
{    

    private static DateTime m_expires;

    public bool HasExpired
    {
        get return DateTime.Now > m_expires;
    }

    private CategoryHandler()
    {
        m_expires = DateTime.Now.AddMinutes(60);
    }

    public static CategoryHandler Instance()
    {
        if(HasExpired)
        {
            //Dispose and reconstruct
        }
        else
        {
            //Use existing instance
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

或者有没有更好的方法来解决这个问题?

Luk*_*keH 5

您需要某种锁定来确保线程安全:

public sealed class CategoryHandler
{
    private static CategoryHandler _instance = null;
    private static DateTime _expiry = DateTime.MinValue;
    private static readonly object _lock = new object();

    private CategoryHandler() { }

    public static bool HasExpired
    {
        get
        {
            lock (_lock) { return (_expiry < DateTime.Now); }
        }
    }

    public static CategoryHandler Instance
    {
        get
        {
            lock (_lock)
            {
                if (HasExpired)
                {
                    // dispose and reconstruct _instance
                    _expiry = DateTime.Now.AddMinutes(60);
                }
                return _instance;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)