一般来说只有创建控件的线程才能访问控件,否则会造成死锁、资源竞争、挂起或暂停的问题,跨线程访问 UI 控件应采用 thread-safe 的方式,微软介绍了两种方式:How to make thread-safe calls to controls (Windows Forms .NET)。
**DataGridView 滚动时的闪烁 (flicker)** 问题:How to prevent DataGridView from flickering when scrolling horizontally? - Stack Overflow。
DataGridView 频繁使用 Refresh () 会导致右侧滚动条变成黑色不可用状态,这时就不能依靠 Refresh () 来重绘控件,可以通过重新绑定 DataSource:
// 使用 thread-safe 的方式跨线程访问 UI 控件
dataGridView1.Invoke(() =>
{
dataGridView1.DataSource = null;
dataGridView1.DataSource = _dataTable;
});