У меня есть текстовое поле, в котором пользователь вводит свой поисковый запрос, и список, в котором программа перечисляет имена из базы данных (около 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. Есть ли обходной путь, чтобы он не зависал?