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