Сброс контроля пользователя после завершения потока - PullRequest
0 голосов
/ 19 марта 2020

У меня есть форма 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.

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