Grazie all'idea di @ Brian e this answer, ho trovato la mia versione di utilizzare un timer per gestire questo problema. Questo ha funzionato bene per me. Spero che aiuti anche gli altri:
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();
}
fonte
2015-12-08 05:45:27
Questo è il metodo che ho usato e ha funzionato perfettamente. Sorprendentemente non ricevo eccezioni sull'aggiornamento dell'interfaccia utente da parte di un altro thread? – esac
Vedere http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S1. La risposta breve è che l'evento viene eseguito nel thread dell'interfaccia utente. Il che ha senso, considerando che è nello spazio dei nomi 'System.Windows.Forms'. – Brian
Si noti che il collegamento della rivista MSDN sopra non è più un collegamento diretto. Puoi ancora accedervi con [archive.org] (https://web.archive.org/web/20130219050936/http://msdn.microsoft.com/en-us/magazine/cc164015.aspx). Oppure, basta scaricare la rivista del febbraio 2004 da quella pagina. Se non hai un lettore CHM, puoi accedere all'articolo estraendo il file CHM usando 7zip e aprendo '/ MSDNMagazineFebruary2004en-us/TimersinNET/chm.htm' – Brian