【发布时间】:2026-01-20 03:50:02
【问题描述】:
大家早上好,我在重写 DataGrid 时遇到了麻烦,该函数可以工作,但我需要进行更快的搜索,所以我的想法是添加并行性。
但在应用后者时,它会为我生成一个错误:System.InvalidOperationException:'无效的跨线程操作:控件'dataGridView1'是从与执行创建的线程不同的线程访问的。'
问题对我来说很清楚,但是我不知道如何解决它。各位大神能帮帮我吗?
我已经尝试过调用 Invoke,但程序进入了无限循环。
private void inputSearch_TextChanged(object sender, EventArgs e)
{
Parallel.For(0, 7, i =>
{
Ricerca(i);
});
}
private void Ricerca(int i)
{
string searchValue = inputSearch.Text.ToUpper();
var re = from row in dataTable.AsEnumerable()
where
row[i].ToString().Contains(searchValue)
select row;
if (re.Count() != 0)
{
Invoke(new Action(() =>
{
dataGridView1.DataSource = re.CopyToDataTable();
dataGridView1.Columns[7].Visible = false;
}));
}
}
【问题讨论】:
-
不要直接从另一个线程访问
DataGrid。仅从您的 UI 线程访问您的 UI。如果您有要并行执行的计算,请将其结果存储在其他地方并使用 UI 线程读取这些结果,并在您的工作人员完成后将它们应用到 UI。还有一些方法可以将部分执行“委托”到 UI 线程中,但这有一些警告,请查看SynchronizationContext(更深入的here)。 -
无限循环与第一个问题有什么关系吗?看起来您使用调用解决了一个问题,现在您遇到了第二个问题。
标签: c# winforms datagridview parallel-processing