Зависает программа, хотя используется 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));