2010-02-27 26 views
3

大家好問題我有一個後臺工作和DataTable。我也有一個計時器。我正在填充計時器中的數據表,並在Backgroundworker_Progress更改我正在將其DataGrid作爲我的DataSource進行分配。但即使這個過程已經完成。我的背景工人沒有得到完成。由於其時我啓動我的exe文件直接背景工人和數據表

回答

3

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

我該如何平行地更新用戶界面 – subbu 2010-03-01 04:19:06

1

你不能沒有做一個調用從後臺線程訪問GUI控件()我的應用程序crashes.This纔會發生。

我懷疑這是你的問題,如果不是你可能需要提供導致該問題的部分的一些代碼。

欲瞭解更多信息,請參閱:

如果你換行代碼在你的後臺工作在try/catch塊,或者改變你視覺工作室設置顯示所有異常,你會看到一個異常,解釋發生了什麼問題。