2012-03-19 11 views
1

私のアプリケーションでは時間がかかるprocess.There前に私は別のスレッドでその操作をしようとします。私はそれを別のスレッド私のメインUIはまだ長い実行process.Butの時間中にフリーズすることがわかったまだ私は把握できませんでしたその理由は?私のコードで何か問題がありますか?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関連に分割する必要があります。 –

+0

あなたのコメントありがとうございました – Renushi

答えて

2

あなたのスレッドは、あなたが戻ってInvokeを使用してUIスレッドに実行をマーシャリングBindDataUIを実行しているあなたのスレッドで

:-)完全に役に立たないです。

あなたの完全なコードは、これと同等です:

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

だけは本当に彼らはUIを更新する必要があるため、このスレッドで実行する必要があるUIスレッドにBindDataGridのこれらの部分をマーシャリングする方が良いだろう。

+0

あなたの素早い対応をありがとうございます。あなたが何を言っているのかわかりにくいです。より詳しく説明してください。 – Renushi

+0

'BeginInvoke'の呼び出しは、UIスレッドで指定されたコードを実行します。だから、本当にそれを使用せずにバックグラウンドスレッドを開始しているのは、UIスレッドにコードをマーシャリングすることだけだからです。 –

+0

Thnxさんの返答のため、あなたの意見があります – Renushi

関連する問題