2012-03-19 58 views
1

在我的應用程序中有耗時的過程。因此,我嘗試在單獨的線程中執行該操作。即使我將它分開了,我的主UI仍然在長時間運行的過程中凍結。但仍然無法弄清楚原因呢?我的代碼中有些東西錯了?用戶界面凍結,甚至過程開始與單獨的線程?

我的事件處理代碼

private void BtnloadClick(object sender, EventArgs e) 
{ 
    if (null != cmbSource.SelectedItem) 
    { 
    string selectedITem = ((FeedSource) cmbSource.SelectedItem).Url; 
    if (!string.IsNullOrEmpty(selectedITem)) 
    {      
     Thread starter = new Thread(() => BindDataUI(selectedITem)); 
     starter.IsBackground = true; 
     starter.Start(); 
    }    
} 

private void BindDataUI(string url) 
{ 
    if (feedGridView1.InvokeRequired) 
    { 
     BeginInvoke(new Action(() => BindDataGrid(url))); 
    } 
    else 
    BindDataGrid(ss); 
} 


private void BindDataGrid(string selectedItem) 
    { 
    for (int i = 0; i < 10; i++) 
    { 
     //Time consuming Process 
    } 
} 
+0

您需要將BindDataGrid拆分爲與UI相關而非與UI相關的內容。 – 2012-03-19 11:55:32

+0

感謝您的意見 – Renushi 2012-03-19 11:58:39

回答

2

你的線程:-)

在您正在執行BindDataUI其編組執行回用Invoke UI線程你的線程完全無用。

你完整的代碼是相同的:

private void BtnloadClick(object sender, EventArgs e) 
{ 
    if (null != cmbSource.SelectedItem) 
    { 
    string selectedITem = ((FeedSource) cmbSource.SelectedItem).Url; 
    if (!string.IsNullOrEmpty(selectedITem)) 
    {  
     BindDataGrid(selectedITem); 
    }    
} 

private void BindDataGrid(string selectedItem) 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     //Time consuming Process 
    } 
} 

這將是更好的只是元帥BindDataGrid這些部件到UI線程真正需要,因爲他們需要更新的UI在此線程運行。

+0

感謝您的快速回復。有點難以理解你在說什麼。你可以再解釋一下 – Renushi 2012-03-19 11:49:37

+0

對'BeginInvoke'的調用在UI線程上執行指定的代碼。所以,你正在開始一個後臺線程而沒有真正使用它,因爲它所做的只是將代碼編組回給UI線程... – 2012-03-19 11:52:01

+0

Thnx哥們爲你的迴應,我明白了你的觀點 – Renushi 2012-03-19 11:55:04