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