Domanda

Quindi, ecco un estratto da uno dei miei corsi:

    [ThreadStatic]
    readonly static private AccountManager _instance = new AccountManager();

    private AccountManager()
    {
    }

    static public AccountManager Instance
    {
        get { return _instance; }
    }

Come si può vedere, si tratta di un filo di Singleton-per-- vale a dire l'istanza è contrassegnato con l'attributo ThreadStatic. L'esempio è anche istanziata come parte di lavori statica.

In modo che sia il caso, come è possibile che sto ricevendo un NullReferenceException nella mia applicazione ASP.NET MVC quando si tenta di utilizzare la proprietà istanza?

È stato utile?

Soluzione

MSDN ThreadStaticAttribute :

  

Non specificare i valori iniziali per   i campi contrassegnati con   ThreadStaticAttribute, perché tale   inizializzazione si verifica una sola volta,   il costruttore della classe esegue, e   influisce pertanto solo thread. Se   non si specifica un valore iniziale,   si può fare affidamento sul campo di essere   inizializzato al valore predefinito se   è un tipo di valore, o ad un nullo   di riferimento (Nothing in Visual Basic) se   si tratta di un tipo di riferimento.

Altri suggerimenti

Questa è una parte confusa dell'attributo ThreadStatic. Anche se esso crea un valore per thread, il codice di inizializzazione del viene eseguito solo su uno dei fili. Tutti gli altri fili che accedono questo valore otterrà predefinito per quel tipo invece del risultato del codice di inizializzazione.

Invece di inizializzazione valore, avvolgerlo in una proprietà che fa l'inizializzazione per voi.

[ThreadStatic]
readonly static private AccountManager _instance;

private AccountManager()
{
}

static public AccountManager Instance
{
  get 
  { 
    if ( _instance == null ) _instance = new AccountManager();
    return _instance; 
  }
}

Poiché il valore _instance è unico per ogni filo, senza bloccaggio è necessaria nella proprietà e può essere trattata come qualsiasi altro valore pigramente inizializzato.

Hai colpito una [ThreadStatic] classico "101" qui.

L'inizializzatore statico attiva una sola volta, anche se è contrassegnato come [ThreadStatic], così altri thread (a parte la prima) vedrà questo Non inizializzato.

Credo che ciò che sta accadendo è che il campo statico è solo in fase di inizializzazione una volta così quando un altro thread tenta di leggere il campo sarà nullo (sin dal suo valore di default), perché _instance non può essere inizializzato di nuovo. Il suo solo un pensiero, ma e ho potuto essere completamente fuori strada, ma questo è quello che penso sta accadendo.

Un campo statico contrassegnato con ThreadStaticAttribute non è condiviso tra i thread. Ogni thread di esecuzione ha un'istanza separata del campo, e indipendentemente imposta e ottiene i valori per il campo. Se il campo si accede in un thread diverso, conterrà un valore diverso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top