Gracias a la idea de @ Brian y al this answer, se me ocurrió mi propia versión del uso de un temporizador para manejar este problema. Esto funcionó bien para mi. Espero que también ayude a los demás:
private Timer _tmrDelaySearch;
private const int DelayedTextChangedTimeout = 500;
private void txtSearch_TextChanged(object sender, EventArgs e)
{
if (_tmrDelaySearch != null)
_tmrDelaySearch.Stop();
if (_tmrDelaySearch == null)
{
_tmrDelaySearch = new Timer();
_tmrDelaySearch.Tick += _tmrDelaySearch_Tick;
_tmrDelaySearch.Interval = DelayedTextChangedTimeout;
}
_tmrDelaySearch.Start();
}
void _tmrDelaySearch_Tick(object sender, EventArgs e)
{
if (stcList.SelectedTab == stiTabSearch) return;
string word = string.IsNullOrEmpty(txtSearch.Text.Trim()) ? null : txtSearch.Text.Trim();
if (stcList.SelectedTab == stiTabNote)
FillDataGridNote(word);
else
{
DataGridView dgvGridView = stcList.SelectedTab == stiTabWord ? dgvWord : dgvEvent;
int idType = stcList.SelectedTab == stiTabWord ? 1 : 2;
FillDataGrid(idType, word, dgvGridView);
}
if (_tmrDelaySearch != null)
_tmrDelaySearch.Stop();
}
Este es el método que utilicé y funcionó perfectamente. Sorprendentemente, no recibo ninguna excepción sobre la actualización de la interfaz de usuario por otro hilo. – esac
Consulte http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S1. La respuesta corta es que el evento se ejecuta en el hilo de UI. Lo cual tiene sentido, considerando que está en el espacio de nombres 'System.Windows.Forms'. – Brian
Tenga en cuenta que el enlace de la revista MSDN anterior ya no es un enlace directo. Aún puede acceder a él con [archive.org] (https://web.archive.org/web/20130219050936/http://msdn.microsoft.com/en-us/magazine/cc164015.aspx). O simplemente descargue la revista de febrero de 2004 de esa página. Si no tiene un lector de CHM, puede acceder al artículo extrayendo el archivo CHM usando 7zip y abriendo '/ MSDNMagazineFebruary2004en-us/TimersinNET/chm.htm' – Brian