2012-03-19 2 views
1

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

Мои события Hander Код

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. –

+0

Благодарим за ваши комментарии – Renushi

ответ

2

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

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

+0

Спасибо за ваш быстрый ответ. Мне сложно понять, что вы говорите. Скажите, пожалуйста, объясните мне больше. – Renushi

+0

Вызов 'BeginInvoke' выполняет указанный код в потоке пользовательского интерфейса. Итак, вы начинаете фоновый поток, не используя его, потому что все, что он делает, - это перевести код обратно в поток пользовательского интерфейса ... –

+0

Thnx чувак для вашего ответа, я получил вашу точку – Renushi