Вопрос

Вызов и завершение БП из C#

Запускаю из сервиса БП, в котором нет никаких ожиданий.

UserConnection 	userConnection	= HttpContext.Current.Session["UserConnection"] as UserConnection;
var 			manager 		= userConnection.ProcessSchemaManager;
var 			processSchema 	= manager.GetInstanceByName("UsrProcess");
var 			process 		= processSchema.CreateProcess(userConnection);
 
process.SetPropertyValue("ExternalCall", true);
process.Execute(userConnection);

Подскажите, как дождаться завершения БП и прочитать параметры, которые мы имеем в конце выполнения?

У меня такой же вопрос

8 комментариев
Лучший ответ

Добрый день!
Данное действие синхронно, т.е. после завершения операции process.Execute(userConnection); уже можно забирать параметры.
Забирать их следующим образом (пример):

res.Success = process.GetPropertyValue("RpSuccess") != null ? (bool)process.GetPropertyValue("RpSuccess") : false;
res.ErrorDescription = process.GetPropertyValue("RpReturnMsg") != null ? (string)process.GetPropertyValue("RpReturnMsg") : "";

 

Добрый день!
Данное действие синхронно, т.е. после завершения операции process.Execute(userConnection); уже можно забирать параметры.
Забирать их следующим образом (пример):

res.Success = process.GetPropertyValue("RpSuccess") != null ? (bool)process.GetPropertyValue("RpSuccess") : false;
res.ErrorDescription = process.GetPropertyValue("RpReturnMsg") != null ? (string)process.GetPropertyValue("RpReturnMsg") : "";

 

Я бы еще добавил проверку что БП завершен а не свалилися например с ошибкой или еще выполняется, примерно так. 

if (process.Status != ProcessStatus.Running && process.Status != ProcessStatus.Error)

or

if (process.Status == Terrasoft.Core.Process.ProcessStatus.Done)

Как выяснилось, мне нужен интерпретируемый процесс, а там все немного по-другому, а именно

UserConnection 	userConnection	= HttpContext.Current.Session["UserConnection"] as UserConnection;
var manager 		= userConnection.ProcessSchemaManager;
var processSchema 	= manager.GetInstanceByName("UsrPreCreateDealProcess");
var flowEngine 		= new Terrasoft.Core.Process.FlowEngine(userConnection);
Dictionary<string, object> parameter = new Dictionary<string, object>();
parameter.Add("CarId", car_id);
Terrasoft.Core.Process.ProcessDescriptor pd = flowEngine.RunProcess(processSchema, parameter);
if (pd.ProcessStatus == Terrasoft.Core.Process.ProcessStatus.Done)
{
	?????
}

Как вытащить параметры в конце выполнения здесь?

Есть предположение, что копать стоит в сторону FlowEngineStateService, у него есть метод FindProcessComponentSet(Guid processUId), который возвращает инфу о процессе. И там уже забрать параметры

Сидоров Александр В.,

я нашел этот класс, у него есть метод GetParameterValue, но он стабильно возвращает, что параметр не найден по данному пути и возникает (философский) вопрос, что есть Путь? Видимо, это не просто имя. Но товарищи из Террасофта не догадались описать этот момент нигде ни разу.

перепробовал всё с FlowEngineStateService - ничего не работает, написал в ТП

Вообще, не очень хорошо запускать процессы и ждать их завершения синхронно. Ведь процесс может выполняться некоторое время или вообще иметь элементы для общения с пользователем. Лучше будет в самом процессе записывать результаты в какую-то таблицу, а потом периодически её новые записи обрабатывать.

ТП ответила, что решения в 7.11 нет. Я так и знал :)) и заранее сделал обходной путь через БД. Заодно полезное для отладки логирование получилось

Войдите или зарегистрируйтесь, чтобы комментировать