【发布时间】:2010-03-01 13:47:34
【问题描述】:
大家好,我有一个后台工作人员和一个数据表。我也有计时器。我正在计时器中填充数据表,并且在 Backgroundworker_Progress 中更改了我将它作为我的数据源分配给我的 DataGrid。但即使在这个过程已经完成之后。我的后台工作人员没有完成。因此我的应用程序崩溃了。只有当我直接启动我的 exe 时才会发生这种情况
【问题讨论】:
标签: c#
大家好,我有一个后台工作人员和一个数据表。我也有计时器。我正在计时器中填充数据表,并且在 Backgroundworker_Progress 中更改了我将它作为我的数据源分配给我的 DataGrid。但即使在这个过程已经完成之后。我的后台工作人员没有完成。因此我的应用程序崩溃了。只有当我直接启动我的 exe 时才会发生这种情况
【问题讨论】:
标签: c#
我同意@Simon。粘贴一些代码,以便我们了解可能出现的问题。 还有,你为什么要用定时器?
不要在ProgressChanged 事件中分配DataTable。在RunWorkerCompleted 活动中进行。这是我认为你应该做的:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
e.Result = GetTableData();
}
catch (Exception ex)
{
e.Result = ex;
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// only display progress, do not assign it to grid
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Result is DataTable)
{
dataGridView1.DataSource = e.Result as DataTable;
}
else if (e.Result is Exception)
{
}
}
private DataTable GetTableData()
{
DataTable table = new DataTable();
for (int i = 0; i < NumOfRows; i++)
{
//... fill data here
backgroundWorker1.ReportProgress(i * 100F / NumOfRows);
}
return table;
}
【讨论】:
如果不执行 invoke(),您将无法从后台线程访问 GUI 控件。
我怀疑这是您的问题,如果不是,您可能需要提供导致问题的部分代码。
欲了解更多信息,请参阅:
如果您将后台工作程序中的代码包装在 Try/Catch 块中,或者更改您的 Visual Studio 设置以显示所有异常,您将看到一个解释问题所在的异常。
【讨论】: