Nhờ ý tưởng của @ Brian và this answer, tôi đã đưa ra phiên bản sử dụng bộ hẹn giờ để xử lý vấn đề này. Điều này làm việc tốt cho tôi. Tôi hy vọng nó cũng sẽ giúp những người khác:
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();
}
Nguồn
2015-12-08 05:45:27
Đây là phương pháp tôi đã sử dụng và nó hoạt động hoàn hảo. Đáng ngạc nhiên là tôi không nhận được bất kỳ ngoại lệ nào về giao diện người dùng đang được cập nhật bởi một chuỗi khác? – esac
Xem http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S1. Câu trả lời ngắn gọn là sự kiện được thực thi trong chuỗi giao diện người dùng. Điều này có ý nghĩa, cho rằng nó nằm trong không gian tên 'System.Windows.Forms'. – Brian
Lưu ý rằng liên kết tạp chí MSDN ở trên không còn là liên kết trực tiếp nữa. Bạn vẫn có thể truy cập nó bằng [archive.org] (https://web.archive.org/web/20130219050936/http://msdn.microsoft.com/en-us/magazine/cc164015.aspx). Hoặc, chỉ cần tải xuống tạp chí tháng 2 năm 2004 từ trang đó. Nếu bạn không có trình đọc CHM, bạn có thể truy cập bài viết bằng cách giải nén tệp CHM bằng cách sử dụng 7zip và mở '/ MSDNMagazineFebruary2004en-us/TimersinNET/chm.htm' – Brian