Использование побочного потока
Столкнулся с проблемой зависания формы при вычислениях в основном потоке, почитал, узнал что метод вычисления можно пустить вторым потоком. Использую:
Thread tr = new Thread(Calculate);
tr.Start();
Код Calculate:
public static void Calculate()
{
date = mainForm.inputData;
int number = logicClass.searchNumber(date);
res = logicClass.Alg1logic(number);
res2 = logicClass.Alg2logic(number);
res3 = logicClass.Alg3logic(number);
res5 = logicClass.Alg5Logic(number);
res4 = logicClass.Alg4Logic(number);
}
Данный метод считает 5 массивов значений, а результат функции, элемент с определенным номером, записывает в поле public. (массивы тоже public и инициализируются внутри каждого метода)
Проблема состоит в том, что при дальнейшем использовании массива оказывается, что все они имеют значение null. Соответственно, массивы не инициализируются, и значения не пишутся. Получается, что то, что выполняется во втором потоке, никак не затрагивают, то, что было объявлено в основном. Необходимо, чтобы при вычислении данных в побочном потоке переменные получали значения, вычисленные там же, и с ними можно было работать далее из основного.
Если можно еще как-то решить проблему с зависанием формы, то такой вариант тоже подойдет. (переменные и массивы статические)
Ответы (1 шт):
Решил проблему: метод, в котором вызываем задачу делаем async, и применяем следующий код:
await Task.Run(() =>
{
int number = logicClass.searchNumber(date);
result1 = logicClass.Alg1logic(number);
result2 = logicClass.Alg2logic(number);
result3 = logicClass.Alg3logic(number);
result5 = logicClass.Alg5Logic(number);
result4 = logicClass.Alg4Logic(number);
//... (используем полученные данные тут же)
});
Метод, в котором вызвали task вызываем как await
В общем виде получаем:
public async static Task RealisationLogic()
{
date = mainForm.inputData;
await Task.Run(() =>
{
int number = logicClass.searchNumber(date);
result1 = logicClass.Alg1logic(number);
result2 = logicClass.Alg2logic(number);
result3 = logicClass.Alg3logic(number);
result5 = logicClass.Alg5Logic(number);
result4 = logicClass.Alg4Logic(number);
rmseClass.Init();
rmseClass.searchRMSE();
rmseClass.searchRMSE1();
rmseClass.searchRMSE5();
rmseClass.searchRMSE3();
rmseClass.searchRMSE4();
});
}
В основном коде программы вызываем как:
await Program.RealisationLogic();