编辑:使用此命令解决:http://reedcopsey.com/2011/11/28/launching-a-wpf-window-in-a-separate-thread-part-1/
在我的项目(.net/windows窗体)中,我用一个大的DataTable
填充了一个DataGridView
。填充可能需要20秒,所以我想要一个动画加载窗口。如果线程繁忙,这个动画就会冻结,所以我必须为窗口或填充DataGridView
使用一个新的线程。
我已经尝试使用BackgroundWorker
来显示窗体,但它将是一个形状正确的空白白色窗口。
我也尝试过使用BackgroundWorker
填充DataGridView
,但它会抛出一个错误,指出DataGridView
正被另一个线程访问,而不是为它创建的那个线程。因为DataGridView
是在designer类中创建的,所以我不能只在新的线程中创建它-而且这个解决方案听起来不是很优雅。
在填写DataGridView
时显示有效的动画表单的最佳方式是什么
编辑:答案没有为我解决这个问题,所以我试着把代码分解成可以在这里展示的东西。我以前没有这样做,因为它似乎没有足够的相关性来处理大约1000行代码。在这里给出的代码中可能遗漏了什么,或者是之前实验中的一些残留物。请忽略函数的错误命名,这是一个遗留的问题,一旦我让它工作,我就会修复它。代码的一部分是古老的。
我已经让它无错误地运行,但frmLoading仍然没有动画(不过,如果我在工作线程不忙的时候让它保持活动状态,它就是动画)。
namespace a
{
public partial class frmMain : DockContent, IPlugin
{
//...
private delegate void SafeCallDelegate(DataTable dt);
private Thread thread1 = null;
private frmLoading frmLoading = new frmLoading();
public frmMain()
{
//...
}
//...
private void FillDataGrid(DataTable dt)
{
if(this.InvokeRequired)
{
var d = new SafeCallDelegate(FillDataGrid);
Invoke(d, new object[] { dt });
}
else
{
//...
DataGridFiller(dt);
}
}
private void DataGridFiller(DataTable dt)
{
BindingSource dataSource = new BindingSource(dt, null);
//...
dgvData.DataSource = dataSource;
//...
frmLoading.Hide();
}
private void btnGetData_Click(object sender, EventArgs e)
{
DataTable dt = [...];
// Wenn Daten vorhanden sind, dann anzeigen
if (dt != null)
{
//...
frmLoading.Show();
thread1 = new Thread(() => FillDataGrid(dt));
thread1.Start();
}
}
}
}
https://stackoverflow.com/questions/56668732
复制相似问题