Я работаю над следующей программой, которая касается потоков и приоритетов потоков.C# Null Reference Exception
Я создал форму окна, содержащую богатое текстовое поле (DisplayTextBox) и две кнопки (StartButton для запуска приложения и ExitButton для закрытия приложения).
В форме я создаю несколько потоков и запускаю их один за другим. Метод, используемый каждым потоком, находится в классе Threading. Этот метод относится к PrintOnScreen().
В этом методе я добавляю имя потока, а также его приоритет для str типа StringBuilder. Затем я хочу отобразить содержимое str в DisplayTextBox (которое находится в Form.cs).
Однако, я получаю сообщение об ошибке «Ошибка NullReferenceException: необработанный объект: объект не установлен в экземпляр объекта». Линия, где возникает ошибка, следующая:
DisplayTextBox.Text = Convert.ToString (str);
Не могли бы вы помочь мне решить эту ошибку? Благодарю.
Редактировать
Спасибо всем за вашу помощь. Чтобы решить проблему, я скопировал метод PrintOnScreen в класс Form.cs и отменил Threading.cs.
Я позже использовал код, предоставленный Анандом, и разместил его ниже t2.Join(). Теперь это работает как шарм.
Знаете ли вы, какой объект является нулевым? Есть только два возможных ответа на этот вопрос: первым будет ** DisplayTextBox **, второй будет ** str **, конечно, я не вижу, где вы передаете ссылку на DisplayTextBox в форме. Threading наследует Form1, что не означает, что он имеет ссылку на элементы управления Form1. –
Даже если вы исправите свой код и передадите ссылку на ** DisplayTextBox **, вам придется вызывать изменение текста, так как вы не можете изменять элементы управления в отдельном потоке, отличном от основного потока пользовательского интерфейса. –
Вы должны действительно учитывать синхронизацию доступа к данным, к которым вы обращаетесь из нескольких потоков. Например, вы пишете оба потока в одном экземпляре StringBuilder и итерации коллекции Threads. – Jan