【问题标题】:Problems with background Worker and Data Table后台 Worker 和数据表的问题
【发布时间】:2010-03-01 13:47:34
【问题描述】:

大家好,我有一个后台工作人员和一个数据表。我也有计时器。我正在计时器中填充数据表,并且在 Backgroundworker_Progress 中更改了我将它作为我的数据源分配给我的 DataGrid。但即使在这个过程已经完成之后。我的后台工作人员没有完成。因此我的应用程序崩溃了。只有当我直接启动我的 exe 时才会发生这种情况

【问题讨论】:

    标签: c#


    【解决方案1】:

    我同意@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;
    }
    

    【讨论】:

      【解决方案2】:

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

      我怀疑这是您的问题,如果不是,您可能需要提供导致问题的部分代码。

      欲了解更多信息,请参阅:

      如果您将后台工作程序中的代码包装在 Try/Catch 块中,或者更改您的 Visual Studio 设置以显示所有异常,您将看到一个解释问题所在的异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多