Ошибка автозаполнения Texbox - запись в защищенную память - PullRequest
2 голосов
/ 11 июня 2010

У меня есть автозаполнение текстового поля, которое смотрит в базу данных.Иногда, когда я печатал, я получал следующую ошибку:

Попытка чтения или записи в защищенную память.Это часто указывает на то, что другая память повреждена.

Вот код

private void tBSearchName_TextChanged(object sender, EventArgs e)
            {
                try
                {
                    //test length
                    if (tBSearchName.Text.Length > 3)
                    {
                        //prevent db lookups
                        if (!tBSearchName.Text.ToLower().Contains(oldName) || oldName == String.Empty)
                        {
                            //test for a name + first letter of last name
                            if (Regex.IsMatch(tBSearchName.Text, @"(\w)+\s(\w)+(\.)*"))
                            {
                                tBSearchName.AutoCompleteCustomSource = AccessDB.serachByNemberName(tBSearchName.Text);
                                tBSearchName.AutoCompleteMode = AutoCompleteMode.Suggest;
                                //prevent db lookups
                                oldName = tBSearchName.Text.ToLower();
                            }
                        }
                    }
                }
                catch
                {
                }
            } 

Я понимаю, что я должен заморозить ввод в приложение, пока поиск завершен, можетнекоторые подсказывают, как это сделать.Или любое другое понимание того, что происходит

Ответы [ 2 ]

3 голосов
/ 11 июня 2010

Это ошибка в оболочке Windows Forms API автозаполнения . Windows Forms не защищает объект AutoCompleteCustomSource от замены во время его перечисления фоновым потоком, созданным функцией автозаполнения.

Вместо замены хранилища данных вы можете попробовать заменить объект автозаполнения или , используя интерфейс IAutoCompleteDropDown для сброса перечислителя .

0 голосов
/ 11 июня 2010

Вы можете использовать lock :

private void tBSearchName_TextChanged(object sender, EventArgs e)
{
    lock(this) { /* do magic */
}

Обратите внимание, что выполнение длинных задач в обработчиках событий - плохая практика. Если поиск занимает более 30 мс, лучше использовать рабочий поток .

...