Вычисления не отделяются в отдельный от интерфейса поток - 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); 
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5
Похожие ответы