Почему SynchronizationContext.Current равен нулю? - PullRequest
7 голосов
/ 16 августа 2011

Ошибка: Object reference not set to an instance of an object.

Алгоритм ниже работает. Я попробовал это, затем я удалил проект Winform в другой каталог и SynchronizationContext.Current - это null. Почему?

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<int, int[]> 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);
        }
    }
}

1 Ответ

15 голосов
/ 16 августа 2011

Ваш код критически зависит от того, когда и где работает конструктор вашего класса. SynchronizationContext.Current будет нулевым, когда:

  • ваш объект класса создан слишком рано, прежде чем ваш код создаст экземпляр класса Form или вызовет Application.Run () в Main (). Это когда текущий элемент установлен на экземпляр WindowsFormsSynchronizationContext, класса, который знает, как маршализовать вызовы с помощью цикла сообщений. Исправьте это, переместив код объекта в основной конструктор формы.

  • ваш объект класса создан в любом потоке, кроме основного потока пользовательского интерфейса. Только поток пользовательского интерфейса в приложении Winforms может маршалировать вызовы. Выясните это, добавив конструктор в ваш класс с помощью следующего оператора:

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

Также добавьте эту строку в метод Main () в Program.cs. Это не будет работать, если отображаемое значение в окне вывода отличается. Исправьте это, переместив код экземпляра объекта в конструктор основной формы, чтобы вы могли быть уверены, что он работает в потоке пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...