Зависает программа, хотя используется BeginInvoke, и всё должно считаться в другом потоке - C#

Узнай цену своей работы

Формулировка задачи:

У меня есть программа которая моделирует физ процесс, иногда делает это долго, чтобы на форму не ставилось Программа не отвечает, решил вынести расчет в отдельный поток, но пока реализовать это не смог. Просто в процессе счета хочу ещё знать сколько она выполнила% от всего объема. свойства BeginInvoke узнал отсюда http://krez0n.org.ua/archives/686 Итак по нажатию кнопки идет расчет.
 
delegate void SomeDelegateOne(int TTT, double K_pll, double K_mcc, double porositty, double Sff, double Cleftt, double Crightt,double Tempeature,double[] Rx, double[] Sx, double[] Cx, double[] Resx);
private void Solve_Click(object sender, EventArgs e)
{
            TaskInfo.Enabled = true;
            TaskInfo.Text = "Solving HydroDynamic Problem";
            TaskInfo.Refresh();//вывели информацию
 
            HDR g = new HDR();// элемент класса с нужными методами
            g.part_input = part_inputG;//определили имя нужного файла config;
            g.GetRn(out Nxr);//получили число точек по осиX
            Rx = new double[Nxr]; Sx = new double[Nxr]; Cx = new double[Nxr]; Resx = new double[Nxr]; //получаемые данные из метода g
 
            g.TypeZvnz = TypeZvnz;//параметры задачи
            g.TypeRes = TypeResa;
 
            //g.runSolver2(T, K_pl, K_mc, porosity, Sf, Cleft, Cright, Temp, Rx, Sx, Cx, Resx);-сам метод, 
 
            SomeDelegateOne sd = g.runSolver2; // создаем делегат
            IAsyncResult asyncRes = sd.BeginInvoke(T, K_pl, K_mc, porosity, Sf, Cleft, Cright, Temp, Rx, Sx, Cx, Resx, null, null); // вызываем метод -  расчет физ задачи, может считать долго!
            //Проверяем IAsyncResult.IsCompleted
            while (asyncRes.IsCompleted == false)
            {
                prog = g.Progress;//получаем текущее стояние решения задачи
                TaskInfo.Text = "task to End " + prog + "% of full calculation";
                TaskInfo.Refresh();
                Thread.Sleep(500);  // эмулируем работу метода ? 
 
            }
            sd.EndInvoke(asyncRes);
//дальше обрабатываем полученные результаты.
 
  }
       Thread.Sleep(500);  // эмулируем работу метода ?
-эту строку я взял из шаблона, может из-за него и виснет приложение? какой потом засыпает основной? но даже без него всё равно приложение виснет, наверно как-то по другому надо обрабатывать асинхронный вывод данных. то есть мониторить процесс расчета и одновременно делать активным форму не возможно?

Решение задачи: «Зависает программа, хотя используется BeginInvoke, и всё должно считаться в другом потоке»

textual
Листинг программы
this.Invoke(new Action(() => this.progress1.Value += 1));

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


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

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

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