代码之家  ›  专栏  ›  技术社区  ›  subbu

后台工作程序和数据表的问题

c#
  •  3
  • subbu  · 技术社区  · 16 年前

    嗨,我有一个后台工作人员和一个数据表。我也有定时器。我在timer中填写数据表,在backgroundworker_progress changed中,我将其作为数据源添加到datagrid中。但即使在这个过程完成之后。我的后台工作程序没有完成。因此我的应用程序崩溃。只有当我直接启动我的exe时才会发生这种情况

    2 回复  |  直到 16 年前
        1
  •  3
  •   Vivek    16 年前

    我同意“西蒙”。粘贴一些代码以便我们了解可能的错误。 还有,你为什么要用定时器?

    不分配 DataTable 在里面 ProgressChanged 事件。做进去 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;
    }
    
        2
  •  1
  •   Community Mohan Dere    9 年前

    如果不执行invoke(),则无法从后台线程访问gui控件。

    我怀疑这是你的问题,如果不是,你可能需要提供一些代码的部分,是造成问题。

    有关详细信息,请参见:

    如果将代码包装在try/catch块中的后台工作程序中,或者更改visual studio设置以显示所有异常,则会看到一个异常,该异常解释了出现的问题。