public async void Execute(string idtask, CancellationTokenSource cts) { var task = GetTaskById(idtask); if (task != null) { LogIts log; try { var lst = SerializeIts.DeserializeObject <List <TaskParamIts> >(task.Tarefa); //inicia StartTask(task.IdTask, cts); await InsertLogTask(new LogIts(task.IdTask, "Obtendo o tipo...")); // Execute the task //var cl = Assembly.LoadFile(@"C:\Users\Gercy\Documents\TFS_ITsolution\ITE\ITE.Entidades\bin\Debug\ITE.Entidades.dll"); //var qname = typeof(cl.Assembly); var typeName = Type.GetType(task.Classe); object instance = Activator.CreateInstance(typeName, task.IdTask); await InsertLogTask(new LogIts(task.IdTask, "Classe: " + task.Classe)); await InsertLogTask(new LogIts(task.IdTask, "Metodo: " + task.Metodo)); var methodInfo = typeName.GetMethod(task.Metodo); var param = methodInfo.GetParameters(); int i = 0; List <TaskParamIts> parametrosTask = SerializeIts.DeserializeObject <List <TaskParamIts> >(task.Tarefa); dynamic[] parmOrigs22 = new dynamic[parametrosTask.Count]; await InsertLogTask(new LogIts(task.IdTask, "Parametros:")); foreach (var item in parametrosTask) { if (item.ParameterValue.ToString() == "System.Threading.CancellationTokenSource") { parmOrigs22[i] = cts; } else { log = new LogIts(task.IdTask, Thread.CurrentThread.ManagedThreadId.ToString(), item.ParameterName.ToString() + ": " + item.ParameterValue.ToString(), String.Empty); //insere log await InsertLogTask(log); var stp = item.ParameterType.AssemblyQualifiedName; var tp = Type.GetType(stp); parmOrigs22[i] = item.ParameterValue; //parmOrigs22[i] = Convert.ChangeType(item.ParameterValue, // tp); } i++; } //object[] parmOrigs = new object[] { 1000, task.IdTask, cts }; try { Task t1 = new Task(() => { methodInfo.Invoke(instance, parmOrigs22); }); await Task.Factory.StartNew(() => t1.Start()); Task ok = await Task.WhenAny(t1); if ((ok.IsCompleted && ok.Exception == null) && !cts.IsCancellationRequested) { //Work task await DoWorkTask(task.IdTask); } if (ok.Exception != null) { var msg = ok.Exception.InnerExceptions.First(); throw new Exception(msg.InnerException.Message); } if (cts.IsCancellationRequested) { throw new OperationCanceledException("Operação cancelada."); } } catch (OperationCanceledException exCancel) { log = new LogIts(task.IdTask, Thread.CurrentThread.ManagedThreadId.ToString(), exCancel.Message , "Operacao cancelada"); await InsertLogTask(log); SuspendTask(task.IdTask); } catch (TargetInvocationException tex) { log = new LogIts(task.IdTask, Thread.CurrentThread.ManagedThreadId.ToString(), tex.Message , tex.Message); await InsertLogTask(log); await StoppedTaskException(task.IdTask); } catch (Exception ex) { log = new LogIts(task.IdTask, Thread.CurrentThread.ManagedThreadId.ToString(), ex.Message , ex.Message); await InsertLogTask(log); await StoppedTaskException(task.IdTask); } }//fim try catch (Exception ex) { log = new LogIts(task.IdTask, Thread.CurrentThread.ManagedThreadId.ToString(), ex.Message , ex.Message); await InsertLogTask(log); await StoppedTaskException(task.IdTask); } } }
/// <summary> /// Insere uma linha de taskLog na tarefa /// </summary> /// <param name="idTask"></param> public Task InsertLogTask(LogIts taskLog) { var ctx = SchedulerContextGeneric <LogIts> .Instance; return(ctx.Dao.SaveAsync(taskLog)); }