在我的应用程序中有耗时的过程。因此我尝试在单独的线程中执行该操作。即使我盯着它单独的线程我的主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
}
}
答案 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。