У меня есть форма windows, которая запускает поток для проверки указанного c пользовательского ввода. Когда вход получен, поток проверит, соответствует ли ввод пользователю, останавливает текущий поток и запускает событие для отображения пользовательского элемента управления. Код выглядит так:
Thread MyThread;
public partial class Foo : Form {
private event EventHandler MyLoad;
public Foo(){
Thread.CurrentThread.Name = "Main";
InitializeComponent();
this.MyThread = new Thread(new ThreadStart(this.Userinput));
this.MyThread.Start();
}
private void Userinput(){
while(this.MyThread.IsAlive) {
//MatchUser is another method in another class and does all the checking
if (string.IsNullofEmpty(MatchUser()))
continue;
this.Join();
this.Abort();
this.MyLoad += new EventHandler(this.DisplayUserControl);
return;
}
}
private void DisplayUserControl(object sender, EventArgs e) {
if (Thread.CurrentThread.Name == "Main" && !this.MyThread.IsAlive)
this.UserControl.Show();
}
}
public partial class Bar: UserControl {
public Bar(){
InitializeComponent();
}
private void Bar_Load(object sender, EventArgs e) {
// Based on user Display specific Controls.
}
}
При первоначальном тестировании программы без реализованного потока, когда пришло время отображать пользовательский элемент управления Bar
, будет вызвана функция Bar_load
. С реализованным потоком я нахожусь в тупике, почему это больше не вызывается.
Что я пробовал:
- Перед прерыванием потока, получившего пользовательский ввод, пользователь вызывает для изменения необходимых элементов usercontrol. Это делается в методе класса usercontrol. Отображено все, что не изменило необходимых элементов.
- Присоединение потока к основному потоку и его прерывание, чтобы убедиться, что я снова в главном потоке, на котором изначально был создан пользовательский интерфейс (не уверен, что это пользовательский интерфейс Thread (если честно, является основным потоком), и вызывает тот же метод для изменения элементов.
- Вызов метода до того, как l oop в методе потока. Единственное предостережение в том, что это работает при статической настройке определенной информации. Примечание: это был всего лишь тест, и метод должен вызываться после того, как информация о пользователе была получена из потока.
- Изменение метода
Bar_Load
на publi c и вызов это, как функция, использующая this.Bar_Load(this,null)
, и форсирование события Load, this.Bar1.Load += new EventHandler(this.Bar1.Bar_Load)
- Утилизация элемента управления и создание нового объекта
Bar
. Примечание: Ничего не показывалось даже при использовании this.Bar1.Show()
Вопрос:
Почему метод Bar_Load
не вызывается после прерывание потока или после его ручного вызова / принудительное отключение события go.