Как предотвратить зависание, когда пользователь печатает в текстовом поле - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть текстовое поле, в котором пользователь вводит свой поисковый запрос, и список, в котором программа перечисляет имена из базы данных (около 700 записей), которые содержат текст в текстовом поле.

Затем список должен очиститься и обновите снова после изменения текста в текстовом поле. Я создал фонового работника и заставил его начать работать, когда в текстовом поле есть текст, но когда текст в текстовом поле изменяется, я отменяю bgworker, очищаю источник данных списка и затем возобновляю работу. Я создал 2 bgworkers, где один зарезервирован на случай, если другой все еще занят, и при условии, что они ничего не сделают, если оба заняты.

Моя проблема заключается в том, что несмотря на отмену bgworkers и игнорирование они оба заняты, программа по-прежнему зависает при большом количестве совпадений.

Вот мой код:

        BindingList<Entry> searchList = new BindingList<Entry>();
        LbxSearch.DataSource = searchList; //the listbox containing the matching items
        string searchName;

        private void TxtSeach_TextChanged(object sender, EventArgs e)
        {
            seachList.Clear();
            LbxSearch.Visible = false;

            if ((String.IsNullOrWhiteSpace(TxtSeach.Text) || (String.IsNullOrEmpty(TxtSeach.Text))
                return;

            BgwSearch.CancelAsync();
            BgwSearch2.CancelAsync();

            searchName = TxtSeach.Text.ToUpper();

            if (BgwSearch.IsBusy)
            {
                if (BgwSearch2.IsBusy)
                    return;    //if both are busy, do nothing
                else
                    BgwSearch2.RunWorkerAsync();
            }
            else
                BgwSearch.RunWorkerAsync();
        }


        private void BgwSearch_DoWork(object sender, DoWorkEventArgs e)
        {

                    foreach (Entry p in Reg.MasterList)
                    {
                        if (BgwSearch.CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }
                        int j = 0;
                        foreach (char c in p.name.ToUpper()) //check if p.name contains searchName
                        {
                            if (c != searchName[j] && j != 0)
                                break;
                            else if (c == searchName[j])
                                j++;

                            if (j == searchName.Length) // if name contains searchName
                            {
                                BgwSearch.ReportProgress(p.number);
                                break;
                            }
                        }
                    }
        }

        private void BgwSearch_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            int index = e.ProgressPercentage - 1;

            LbxSearch.Visible = true;

            if (BgwSearch.CancellationPending)
                return;

            searchList.Add(Reg.MasterList[index]);
        }

BgwSearch2 в основном имеет тот же код, что и BgwSearch, с необходимыми изменениями имени , Запись - это класс, который имеет строковое имя и номер int. Есть ли обходной путь, чтобы он не зависал?

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