UI冻结甚至进程启动与单独的线程?

时间:2012-03-19 11:29:13

标签: c# multithreading visual-studio-2010 data-binding

在我的应用程序中有耗时的过程。因此我尝试在单独的线程中执行该操作。即使我盯着它单独的线程我的主UI仍然在长时间运行的过程中冻结。但仍然我无法弄清楚原因是什么?我的代码有些不对劲?

My Event Hander Code

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
    }
 }

1 个答案:

答案 0 :(得分: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。