Perché SynchronizationContext.Current è nullo?

Errore: il Object reference not set to an instance of an object.

L’algoritmo di seguito funziona. L’ho provato, quindi ho rimosso il progetto Winform in un’altra directory e SynchronizationContext.Current è null . Perché?

 SynchronizationContext uiCtx = SynchronizationContext.Current; private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int[] makeSelfMoves = new int[4]; lock (replay) { // count should be more than 2 foreach (KeyValuePair item in replay) { makeSelfMoves = replay[item.Key]; codeFile.ExecuteAll(makeSelfMoves[0], makeSelfMoves[1], makeSelfMoves[2], makeSelfMoves[3]); // i get the error here. uictx is null uiCtx.Post(o => { PrintPieces(codeFile.PieceState()); }, null); System.Threading.Thread.Sleep(1000); } } } 

Il tuo codice dipende in modo critico da esattamente quando e dove viene eseguito il costruttore della tua class. SynchronizationContext.Current sarà null quando:

  • il tuo object di class viene creato troppo presto, prima che il codice crei un’istanza della class Form o chiama Application.Run () in Main (). Quello è quando il membro Corrente è impostato su un’istanza di WindowsFormsSynchronizationContext, la class che sa come effettuare il marshalling delle chiamate con il loop dei messaggi. Risolvi questo problema spostando il codice di istanza dell’object nel costruttore di moduli principale.

  • il tuo object di class viene creato su qualsiasi thread diverso dal thread principale dell’interfaccia utente. Solo il thread dell’interfaccia utente in un’applicazione Winforms può effettuare il marshalling delle chiamate. Diagnostica questo aggiungendo un costruttore alla tua class con questa affermazione:

      Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); 

Aggiunga anche questa linea al metodo Main () in Program.cs. Non funzionerà se il valore visualizzato nella finestra Output è diverso. Risolvi questo problema spostando il codice di istanza dell’object su, di nuovo, il costruttore di moduli principale in modo da poter essere sicuro che venga eseguito sul thread dell’interfaccia utente.