views:

75

answers:

2

I have an autocompleate textbox that looks into a data base. Some times while I'm typing I received the following error.

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Here is the code

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
                {
                }
            } 

My insight is that I should frezz typing into the application while search is done, can some suggest how to do this. Or any other insight on what is happening

A: 

You can use lock:

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

Do note that it's bad practice to perform long tasks in the event handlers. If the search takes more then 30ms, better use a worker thread.

Am
+2  A: 

It is a bug in Windows Forms's wrapper of autocomplete APIs. It does not protect the AutoCompleteCustomSource object from being replaced while it is being enumerated by a background thread created by autocomplete.

Instead of replacing the data store, you can try replace the autocomplete object or use the IAutoCompleteDropDown interface to reset the enumerator.

Sheng Jiang 蒋晟