UI зависает даже процесс запуска с отдельным потоком? - PullRequest
1 голос
/ 19 марта 2012

В моем приложении есть трудоемкий процесс. Поэтому я пытаюсь выполнить эту операцию в отдельном потоке. Даже когда я смотрю на него в отдельном потоке, мой основной пользовательский интерфейс все еще зависает во время длительного процесса. Но я все еще не могу понять,причина этого? Что-то не так в моем коде?

Код моего события

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 Ответ

2 голосов
/ 19 марта 2012

Ваша тема совершенно бесполезна: -)

В вашем потоке вы выполняете BindDataUI, который выполняет маршалинг выполнения обратно в поток пользовательского интерфейса, используя Invoke.

Ваш полный код эквивалентен этому:

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 в поток пользовательского интерфейса, который действительно должен быть запущен в этом потоке, потому что им необходимо обновить пользовательский интерфейс.

...