public async Task EjecutarTareaAsync(int idTarea, int idProcesoWorkflow) { var dbe = new WorkflowNetEntities(); var item = dbe.tareas_estado.Find(idTarea); await Task.Factory.StartNew(() => { try { string metodo = item.metodo; string rutaDll = item.ruta_dll; string parametros = item.parametros; string stringType = item.nombre_libreria + "." + item.nombre_clase; Assembly AssemblyClase; object result = null; if (!File.Exists(rutaDll)) { throw new FileNotFoundException("el archivo dll no existe"); } AssemblyClase = Assembly.LoadFile(rutaDll); Type type = Type.GetType(stringType); if (string.IsNullOrEmpty(type.ToString())) { throw new FileLoadException("la variable " + item.nombre_libreria + " de la clase " + item.nombre_clase + " es nula"); } ConstructorInfo magicConstructor = type.GetConstructor(Type.EmptyTypes); object magicClassObject = magicConstructor.Invoke(new object[] { }); MethodInfo magicMethod = type.GetMethod(metodo); if (magicMethod == null) { throw new InvalidOperationException("el metodo no existe"); } ParameterInfo[] parameters = magicMethod.GetParameters(); /////////////////validacion para metodos con parametros if (parameters.Length == 0) { result = magicMethod.Invoke(magicClassObject, null); } else { var parametersArray = new object[] { parametros.Split(';') }; result = magicMethod.Invoke(magicClassObject, parametersArray); } trackAsync.Add(Task.Run(() => TrackAsync("resultado", "EjecutarTareaAsync", result.ToString(), "idProcesoWorkflow:" + idProcesoWorkflow + ",estado:" + item.id_estado + ",metodo:" + metodo + ",stringType:" + stringType + ",rutaDll:" + rutaDll + ",parametros:" + parametros))); return(result); } catch (Exception ex) { trackAsync.Add(Task.Run(() => TrackAsync("excepcion", "EjecutarTareaAsync", ex.ToString(), "idProcesoWorkflow:" + idProcesoWorkflow + ",idTarea:" + idTarea))); throw ex; } }); }
private async Task TrackAsync(string tipo, string metodo, string resultado, string descripcion) { await Task.Factory.StartNew(() => { var dbe = new WorkflowNetEntities(); tracks track = dbe.tracks.Add(new tracks()); track.tipo_respuesta = tipo; track.metodo = metodo; track.respuesta = resultado; track.descripcion = descripcion; track.fecha = DateTime.Now; dbe.SaveChanges(); }); }
public WorkflowControl() { db = new WorkflowNetEntities(); }