Вычисления не отделяются в отдельный от интерфейса поток - C#
Формулировка задачи:
Почему интерфейс виснет
, даже при учете того что я выделяю под него свой поток? сразу ремарка, пишу под 3.5 .NET, поэтому у меня нет под рукой async и await, а также вкусного Task.Run()//стандартный делегат
delegate void DoRefreshWork();
//вызываемый метод
void RefreshConsPlatList()
{
if (consolidationPlatformListDataGridView.InvokeRequired == false)
{
_consPlatformList = ConsolidationPlatformList.GetConsolidationPlatformList();
consolidationPlatformListDataGridView.DataSource = null;
consolidationPlatformListDataGridView.DataSource = _consPlatformList;
}
else
{
DoRefreshWork work = new DoRefreshWork(RefreshConsPlatList);
this.BeginInvoke(work);
}
}
//и эвэнт, который создает поток. Он не ругается на то, что я обращаюсь к интерфейсу
//не из родного потока, но и не спасает от лагов. Т.е. что есть, что нет его
private void btn_Refresh_Click(object sender, EventArgs e)
{
DoRefreshWork work = new DoRefreshWork(RefreshConsMaterList);
work.BeginInvoke(null, null);
}Решение задачи: «Вычисления не отделяются в отдельный от интерфейса поток»
textual
Листинг программы
//два делегата вместо одного
delegate void DoGetList();
delegate void DoRefreshControl();
//get метод: получаю список объектов из бизнес логики
void GetConsMaterList()
{
_consMaterialList = ConsolidationMaterialList.GetConsolidationMaterialList();
//здесь вызываю основной поток для прорисовки контролов
this.Invoke(new DoRefreshControl(RefreshConsMaterList));
}
//обновляю датасорс
void RefreshConsMaterList()
{
consolidationMaterialListDataGridView.DataSource = null;
consolidationMaterialListDataGridView.DataSource = _consMaterialList;
}
//из эвэнта вызываю поток для работы с бизнес логикой (основная нагрузка)
private void btn_ConsMater_Click(object sender, EventArgs e)
{
DoGetListWork getList = GetConsMaterList;
getList.BeginInvoke(null, null);
}