Код ниже должен работать для вас:
private delegate void SetDGVValueDelegate(BindingList<Something> items);
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Some call to your data access layer to get dt
SetDGVValue(DataTable dt)
}
private void SetDGVValue(DataTable dt)
{
if (dataGridView1.InvokeRequired)
{
dataGridView1.Invoke(new SetDGVValueDelegate(SetDGVValue), dt);
}
else
{
dataGridView1.DataSource = dt;
}
}
В своем вопросе вы упомянули об использовании BindingSource, у которого нет метода Invoke - если у вас есть источник привязки, вы можете вместо этого использовать Invoke в форме:
// On the form
public void SetBindingSourceDataSource(object newDataSource)
{
if (InvokeRequired)
Invoke(new Action<object>(SetBindingSourceDataSource), newDataSource);
else
this.bindingSource.DataSource = newDataSource;
}
Вы также можете сделать это в одной строке, используя выражения Lamda:
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Some call to your data access layer to get dt
dataGridView1.Invoke((Action)(() => dataGridView1.DataSource = dt));
}