2012-03-19 55 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