From 986ea7bc336e0b17bd20183509bbf5b66afe00c7 Mon Sep 17 00:00:00 2001 From: Elena Date: Wed, 9 Feb 2022 00:18:59 +0100 Subject: [PATCH] =?UTF-8?q?Avances=20exportaci=C3=B3n,=20pruebas=20ventana?= =?UTF-8?q?=20de=20progreso=20y=20exportaci=C3=B3n=20recogida?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Button/ButtonLimp.cs | 4 +- Button/ButtonRec.cs | 2 - Helper/HelperGdb.cs | 36 ++++-- Helper/HelperGlobal.cs | 24 ++++ Model/Limpieza.cs | 14 +-- Model/OliviaGlob.cs | 8 +- Model/Recogida.cs | 19 ++- Model/TratamientoComun.cs | 10 ++ Resource1.Designer.cs | 9 ++ Resource1.resx | 3 + Services/EjecServ.cs | 130 +++++++++++--------- Services/LimpiezaServ.cs | 9 +- Services/RecogidaServ.cs | 10 +- ViewModel/Limpieza/PaneLimpiezaViewModel.cs | 5 +- ViewModel/Recogida/PaneRecogidaViewModel.cs | 5 +- 15 files changed, 170 insertions(+), 118 deletions(-) diff --git a/Button/ButtonLimp.cs b/Button/ButtonLimp.cs index c27e700..324a816 100644 --- a/Button/ButtonLimp.cs +++ b/Button/ButtonLimp.cs @@ -25,10 +25,8 @@ namespace OliviaAddInPro { protected override void OnClick() { - ///////////////////////////////////////////////////// + ///////////////////////////////////////////////////// - OliviaGlob.progrDialog= new ProgressDialog( - "Procesando", "Canceled", 100, false); if (OliviaGlob.TipoEjec == TiposEjecucion.Ninguno) { ///Comprueba que existe la red navegable configurada diff --git a/Button/ButtonRec.cs b/Button/ButtonRec.cs index def4442..af25b78 100644 --- a/Button/ButtonRec.cs +++ b/Button/ButtonRec.cs @@ -25,8 +25,6 @@ namespace OliviaAddInPro { protected override void OnClick() { - OliviaGlob.progrDialog = new ProgressDialog( - "Procesando", "Canceled", 100, false); if (OliviaGlob.TipoEjec==TiposEjecucion.Ninguno) { ///Comprueba que existe la red navegable configurada diff --git a/Helper/HelperGdb.cs b/Helper/HelperGdb.cs index 166c273..4048112 100644 --- a/Helper/HelperGdb.cs +++ b/Helper/HelperGdb.cs @@ -779,7 +779,7 @@ namespace OliviaAddInPro.Helper return res; } - public static bool ExportShp2(string pathLayerIn, SpatialQueryFilter filter, string nameShp, string outpath, CancelableProgressorSource cps) + public static bool ExportShp2(string pathLayerIn, SpatialQueryFilter filter, string nameShp, string outpath, CancelableProgressorSource cps, int incmax=100) { if (!System.IO.Directory.Exists(outpath)) System.IO.Directory.CreateDirectory(outpath); @@ -796,7 +796,7 @@ namespace OliviaAddInPro.Helper return false; } List ids = new List(); - cps.Status = "Aplicando filtro espacial a exportación"; + //Añade a la lista los ids que cumplen el filtro espacial using (RowCursor cursor = fc.Search(filter)) { @@ -818,10 +818,10 @@ namespace OliviaAddInPro.Helper string whereClause = GetWhereClauseFromIds(ids); /////////////////////////////////////////////////////////// - ///Exporta - cps.Status = "Exportando datos"; + ///Exporta string[] args = { pathLayerIn, outpath, nameShp, whereClause }; // execute the tool + uint valini = cps.Value; IGPResult gpResult = Geoprocessing.ExecuteToolAsync("FeatureClassToFeatureClass_conversion", args, null, cps.CancellationTokenSource.Token, @@ -837,10 +837,7 @@ namespace OliviaAddInPro.Helper case "OnProgressMessage": { string msg = string.Format("{0}: {1}", new object[] { event_name, (string)o }); - Debug.WriteLine(msg); - ; - //System.Windows.MessageBox.Show(msg); - //_cts.Cancel(); + Debug.WriteLine(msg); ; } break; @@ -848,11 +845,11 @@ namespace OliviaAddInPro.Helper { string msg2 = string.Format("{0}: {1} %", new object[] { event_name, (int)o }); Debug.WriteLine(msg2); - var av = (int)0; + var av = (int)o; if (av > 0) { - cps.Value = (uint)(80 * av * 0.2); - } + cps.Value += (uint)((float)av/100*Math.Min(incmax, cps.Max-valini)); + } // if ((int)o < 0) //System.Windows.MessageBox.Show(msg2); //_cts.Cancel(); @@ -860,8 +857,22 @@ namespace OliviaAddInPro.Helper } } }).Result; - cps.Status = "Finalizando exportacion"; + if (gpResult.IsCanceled) + { + cps.CancellationTokenSource.Cancel(); + return false; + } + if(gpResult.IsFailed) + { + string msg; + if (gpResult.ErrorMessages != null) + msg = gpResult.ErrorMessages.First().Text; + else + msg = "Errores en la exportación"; + OutStr = "Error: " + msg; + return false; + } return true; } catch (Exception ex) @@ -946,7 +957,6 @@ namespace OliviaAddInPro.Helper */ cps.Status = "Guardando geometria a shp"; - //var progSrc = new CancelableProgressorSource(); string[] args = { pathLayerIn, outpath }; // execute the tool IGPResult gpResult = Geoprocessing.ExecuteToolAsync("FeatureClassToShapefile_conversion", args, diff --git a/Helper/HelperGlobal.cs b/Helper/HelperGlobal.cs index aae50a3..910bfa5 100644 --- a/Helper/HelperGlobal.cs +++ b/Helper/HelperGlobal.cs @@ -8,6 +8,7 @@ using ArcGIS.Desktop.Internal.Framework.Controls; using ArcGIS.Desktop.Framework.Dialogs; using System.Windows; using System.IO; +using ArcGIS.Desktop.Framework.Threading.Tasks; namespace OliviaAddInPro.Helper { @@ -79,5 +80,28 @@ namespace OliviaAddInPro.Helper } } + + } + + public class MyCancelableProgressorSource + { + public CancelableProgressorSource _ProgrSrc; + public MyCancelableProgressorSource(ProgressDialog prodlg) + { + _ProgrSrc = new CancelableProgressorSource(prodlg); + _ProgrSrc.Max = 100; + } + public void Init(string stat) + { + _ProgrSrc.Value = 0; + _ProgrSrc.Status = stat; + } + public void IncMessage(uint inc, string mes) + { + if ((_ProgrSrc.Value + inc) < _ProgrSrc.Max) + _ProgrSrc.Value += inc; + _ProgrSrc.Message = mes; + } + } } diff --git a/Model/Limpieza.cs b/Model/Limpieza.cs index 625d496..219c665 100644 --- a/Model/Limpieza.cs +++ b/Model/Limpieza.cs @@ -47,24 +47,22 @@ namespace OliviaAddInPro.Model public Limpieza() { Serv = new LimpiezaServ(this); + ProgrSrc = new MyCancelableProgressorSource(OliviaGlob.progrDialog); } - public TareaRes Ejecuta(ModosEjec modo, CancelableProgressorSource cps) + public TareaRes Ejecuta(ModosEjec modo) { TareaRes res = null; - res = Serv.Ejecuta(modo, cps); + res = Serv.Ejecuta(modo); return res; } - public async void EjecutaAsync(ModosEjec modo, CancelableProgressorSource cps, Action ffin) + public async void EjecutaAsync(ModosEjec modo, Action ffin) { await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => - { - cps.Status = "Procesando"; - cps.Value = 0; - var res = Ejecuta(modo, cps); + { + var res = Ejecuta(modo); ffin(res); return res; - }); } diff --git a/Model/OliviaGlob.cs b/Model/OliviaGlob.cs index 09c629e..2a3e92a 100644 --- a/Model/OliviaGlob.cs +++ b/Model/OliviaGlob.cs @@ -74,9 +74,9 @@ namespace OliviaAddInPro.Model public static string ftclass_ejes; // ffin) + public async void EjecutaAsync(ModosEjec modo, Action ffin) { await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => - { - cps.Status = "Procesando"; - cps.Value = 0; - var res = Ejecuta(modo, cps); + { + var res = Ejecuta(modo); ffin(res); return res; diff --git a/Model/TratamientoComun.cs b/Model/TratamientoComun.cs index c3c0b96..82c3ba9 100644 --- a/Model/TratamientoComun.cs +++ b/Model/TratamientoComun.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using ArcGIS.Core.Geometry; using ArcGIS.Desktop.Internal.Layouts.Utilities; +using OliviaAddInPro.Helper; namespace OliviaAddInPro.Model { @@ -61,6 +62,10 @@ namespace OliviaAddInPro.Model * Coordenadas de la instalación */ public Coordinate2D CoordsInstal { get; set; } = new Coordinate2D(0, 0); + /** + * Coordenadas de la planta de descarga, solo hace falta para recogida + */ + public Coordinate2D CoordsPlanta { get; set; } = new Coordinate2D(0, 0); /** * Buffer para la exportación, en metros */ @@ -121,5 +126,10 @@ namespace OliviaAddInPro.Model set { err_str = value;} } + /** + * Para la ventana de progreso + */ + public MyCancelableProgressorSource ProgrSrc; + } } diff --git a/Resource1.Designer.cs b/Resource1.Designer.cs index 3848309..eb4aae1 100644 --- a/Resource1.Designer.cs +++ b/Resource1.Designer.cs @@ -60,6 +60,15 @@ namespace OliviaAddInPro { } } + /// + /// Busca una cadena traducida similar a Se ha cancelado la operación. + /// + internal static string String_cancel_progreso { + get { + return ResourceManager.GetString("String_cancel_progreso", resourceCulture); + } + } + /// /// Busca una cadena traducida similar a General. /// diff --git a/Resource1.resx b/Resource1.resx index 22cc631..81f44f0 100644 --- a/Resource1.resx +++ b/Resource1.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Se ha cancelado la operación + General diff --git a/Services/EjecServ.cs b/Services/EjecServ.cs index 8c6b78c..1b7f5b3 100644 --- a/Services/EjecServ.cs +++ b/Services/EjecServ.cs @@ -35,17 +35,18 @@ namespace OliviaAddInPro.Services * Modo 0, sectorizar * Modo 1, planificar */ - public bool LanzaEjec(ModosEjec modo, CancelableProgressorSource cps, out string ErrStr) + public bool LanzaEjec(ModosEjec modo, out string ErrStr) { ErrStr = string.Empty; try { + com.ProgrSrc.Init("Exportando datos"); //Comprueba que tiene las columnas necesarias para planificar if ((modo == ModosEjec.Planifica) && !CompruebaPlanif()) { ErrStr = "En la capa de ámbitos seleccionada no se encuentran columnas de SECTOR y/o SECUENCIA, necesarias para planificar"; return false; - } + } //Cuenta las filas que cumplen la consulta int nelems = HelperGdb.GetNumElems(com.CapaElems, com.ConsultaAmbs); @@ -55,7 +56,7 @@ namespace OliviaAddInPro.Services return false; } - cps.Status = "Exportando geometria"; + com.ProgrSrc.IncMessage(0, "Exportando geometria"); //Obtiene la geometría que envuelve a los ámbitos Geometry geom_export = null; @@ -80,23 +81,26 @@ namespace OliviaAddInPro.Services //se consigue el tiempo en este instante para añadirlo a los nombres de los archivos de salida (shapefiles) fechaHora = DateTime.Now.ToString("yyyyMMdd_Hmmss"); //Pone nombre al shape en función de los ámbitos, el tratamiento, y los polígonos + timestamp - com.NombreShpExport = prefNameExport + com.NombreShpExp_PrefTto +"_" + fechaHora + extShp; + com.NombreShpExport = prefNameExport + com.NombreShpExp_PrefTto + "_" + fechaHora + extShp; + + com.ProgrSrc.IncMessage(10, "Exportando ámbitos de trabajo"); //exporta los datos de entrada - if (!HelperGdb.ExportShp2(com.CapaElems, filtroEspacial, com.NombreShpExport, OliviaGlob.Paths.DirData, cps)) - //if (!HelperGdb.ExportShp(com.CapaElems, filtroEspacial, com.NombreShpExport, OliviaGlob.Paths.DirData, cps, out ErrStr)) + if (!HelperGdb.ExportShp2(com.CapaElems, filtroEspacial, com.NombreShpExport, OliviaGlob.Paths.DirData, com.ProgrSrc._ProgrSrc, 40)) { - ErrStr = "Error al exportar los ámbitos: "+ HelperGdb.OutStr; + ErrStr = "Error al exportar los ámbitos: " + HelperGdb.OutStr; + return false; + } + if (com.ProgrSrc._ProgrSrc.CancellationTokenSource.IsCancellationRequested) + { + ErrStr = Resource1.String_cancel_progreso; return false; } //Guarda el nombre OliviaGlob.Paths.PathData = OliviaGlob.Paths.DirData + com.NombreShpExport; - if(cps.CancellationTokenSource.IsCancellationRequested) - { - ErrStr = "Se ha cancelado la operación"; - return false; - } - cps.Value = 80; + + com.ProgrSrc.IncMessage(50, "Preparando exportación de red navegable"); + //hace intersecciones espaciales en caso de ámbitos lineales para quitar los que tienen más parte fuera de la zona que dentro //REVISAR /*if (((com.GeomNiv != null) || (com.GeomZon != null)) && @@ -111,76 +115,80 @@ namespace OliviaAddInPro.Services /////////////////////////////////////////////////////////////////////////// //comprueba, si hay restricciones de circulación y hay instalación, que la instalación no está en ellas - if (!com.CoordsInstal.IsEmpty && (com.CoordsInstal.X!=0) && (com.GeomRestr != null)) - { + if (!com.CoordsInstal.IsEmpty && (com.CoordsInstal.X != 0) && (com.GeomRestr != null)) + { Respuesta resp = HelperGdb.IsPtoInGeom(com.CoordsInstal, com.GeomRestr); if (!resp.Value && resp.HasError) { ErrStr = "Error al comprobar si la instalación está contenida en el polígono de restricciones: " + resp.Error.ElementAt(0); return false; } - else if(resp.Value) //sí está contenido en las restricciones - { + else if (resp.Value) //sí está contenido en las restricciones + { ErrStr = "Error, la instalación está en la zona restringida a la circulación "; return false; } - - } - if (cps.CancellationTokenSource.IsCancellationRequested) - { - ErrStr = "Se ha cancelado la operación"; - return false; + } + /////////////////////////////////////////////////////////////////////////// //exporta la red navegable (buffer, le quita las restr...) //se obtiene la geometría a intersecar con la red, que será la que contiene //a todos los ámbitos y la instalación, ampliada un buffer, mayor si hay //restricciones de circulación - Geometry geom_aux = HelperGdb.BufferGeom(geom_export, com.BuffExport).Value; - if(geom_aux==null) + geom_export = HelperGdb.BufferGeom(geom_export, com.BuffExport).Value; + if (geom_export == null) { ErrStr = "Error al añadir buffer a la geometría"; return false; } //quita las restricciones - geom_aux = HelperGdb.QuitaGeom(geom_aux, com.GeomRestr); - if (geom_aux == null) + if (com.GeomRestr != null) { - ErrStr = "Error al intersecar con las restricciones."; - return false; - } - geom_export = geom_aux; - ////////////////////////////////////////////////////////////// - //comprueba si la geometría de exportación contiene a la instalación - if (!com.CoordsInstal.IsEmpty && (com.CoordsInstal.X != 0)) - { - Respuesta resp = HelperGdb.IsPtoInGeom(com.CoordsInstal, geom_export); - if (!resp.Value) //si no lo contiene + geom_export = HelperGdb.QuitaGeom(geom_export, com.GeomRestr); + if (geom_export == null) { - //ha ido mal - if (resp.HasError) + ErrStr = "Error al intersecar con las restricciones."; + return false; + } + } + + ////////////////////////////////////////////////////////////// + //comprueba si la geometría de exportación contiene a la instalación y a la planta de descarga + Coordinate2D[] coords = { com.CoordsInstal, com.CoordsPlanta }; + for (int i = 0; i < coords.Length; i++) + { + if (!coords[i].IsEmpty && (coords[i].X != 0)) + { + Respuesta resp = HelperGdb.IsPtoInGeom(coords[i], geom_export); + if (!resp.Value) //si no lo contiene { - ErrStr = "Error al comprobar si la instalación está contenida en el polígono de exportación: " + resp.Error.ElementAt(0); - return false; - } - else - { - //amplía la geom - Respuesta respGeom = HelperGdb.AddPtoInGeom(com.CoordsInstal, geom_export); - if (respGeom.Value == null) + //ha ido mal + if (resp.HasError) { - //ha ido mal - if (resp.HasError) - ErrStr = resp.Error.ElementAt(0); - else - ErrStr = "Error al incluir punto de instalación en polígono de exportación."; + ErrStr = "Error al comprobar si la instalación está contenida en el polígono de exportación: " + resp.Error.ElementAt(0); return false; } - //actualiza la geometría - geom_export = respGeom.Value; + else + { + //amplía la geom + Respuesta respGeom = HelperGdb.AddPtoInGeom(coords[i], geom_export); + if (respGeom.Value == null) + { + //ha ido mal + if (resp.HasError) + ErrStr = resp.Error.ElementAt(0); + else + ErrStr = "Error al incluir punto de instalación en polígono de exportación."; + return false; + } + //actualiza la geometría + geom_export = respGeom.Value; + } } } } + //Hace el filtro con la geometría final filtroEspacial = HelperGdb.CreateFiler(String.Empty, geom_export); if (filtroEspacial == null) @@ -189,22 +197,22 @@ namespace OliviaAddInPro.Services return false; } - //Prepara naombre de exportación + com.ProgrSrc.IncMessage(60, "Exportando red navegable"); + + //Prepara nombre de exportación com.NombreShpExportNw = prefNameExportNw + fechaHora + extShp; //exporta los datos de entrada string capaNw =System.IO.Path.Combine(OliviaGlob.Paths.PathGdbNw, OliviaGlob.Capas.ftclass_ejes); - //if (!HelperGdb.ExportShp(capaNw, filtroEspacial, com.NombreShpExportNw, OliviaGlob.Paths.DirData, cps, out ErrStr)) - if (!HelperGdb.ExportShp2(capaNw, filtroEspacial, com.NombreShpExportNw, OliviaGlob.Paths.DirData, cps)) + if (!HelperGdb.ExportShp2(capaNw, filtroEspacial, com.NombreShpExportNw, OliviaGlob.Paths.DirData, com.ProgrSrc._ProgrSrc,40)) { ErrStr = "Error al exportar la red navegable: " + HelperGdb.OutStr; return false; } //guarda los nombres del shape - OliviaGlob.Paths.PathNW = OliviaGlob.Paths.DirData + com.NombreShpExportNw; - - if (cps.CancellationTokenSource.IsCancellationRequested) + OliviaGlob.Paths.PathNW = OliviaGlob.Paths.DirData + com.NombreShpExportNw; + if (com.ProgrSrc._ProgrSrc.CancellationTokenSource.IsCancellationRequested) { - ErrStr = "Se ha cancelado la operación"; + ErrStr = Resource1.String_cancel_progreso; return false; } } diff --git a/Services/LimpiezaServ.cs b/Services/LimpiezaServ.cs index 25a4fc7..c4b845b 100644 --- a/Services/LimpiezaServ.cs +++ b/Services/LimpiezaServ.cs @@ -27,7 +27,7 @@ namespace OliviaAddInPro.Services * Modo 0, sectorizar * Modo 1, planificar */ - public TareaRes Ejecuta(ModosEjec modo, CancelableProgressorSource cps) + public TareaRes Ejecuta(ModosEjec modo) { var res = new TareaRes() { @@ -35,10 +35,10 @@ namespace OliviaAddInPro.Services data = null, msg = "" }; + MyCancelableProgressorSource cps = limp.ProgrSrc; com = (TratamientoComun)limp; string nombFileAmbs = string.Empty; - cps.Status = "Preparando filtro para la exportacion"; //Prepara consulta ErrStr = string.Empty; if (!PreparaConsulta(out nombFileAmbs)) @@ -46,15 +46,14 @@ namespace OliviaAddInPro.Services res.msg= "No se ha seleccionado una consulta válida" + limp.ConsultaAmbs; res.Errores = true; return res; - } - cps.Value = 5; + } //Prepara nombre limp.NombreShpExp_PrefTto = "T" + limp.TipoTto.ToString("00") + nombFileAmbs + DameStrPoligs(); string msg = ""; //comienza ejecucion - if(!LanzaEjec(ModosEjec.Sectoriza, cps, out msg)) + if(!LanzaEjec(modo, out msg)) { res.Errores = true; res.msg = msg; diff --git a/Services/RecogidaServ.cs b/Services/RecogidaServ.cs index d790e79..acb3d37 100644 --- a/Services/RecogidaServ.cs +++ b/Services/RecogidaServ.cs @@ -18,6 +18,7 @@ namespace OliviaAddInPro.Services public RecogidaServ(Recogida _reco) { reco = _reco; + RellenaFiltrosReco(); } /* @@ -60,7 +61,7 @@ namespace OliviaAddInPro.Services * Modo 0, sectorizar * Modo 1, planificar */ - public TareaRes Ejecuta(ModosEjec modo, CancelableProgressorSource cps) + public TareaRes Ejecuta(ModosEjec modo) { var res = new TareaRes() { @@ -71,7 +72,7 @@ namespace OliviaAddInPro.Services com = (TratamientoComun)reco; string nombFileAmbs = string.Empty; - cps.Status = "Preparando filtro para la exportacion"; + //Prepara consulta ErrStr = string.Empty; @@ -80,8 +81,7 @@ namespace OliviaAddInPro.Services res.msg = "No se ha seleccionado una consulta válida" + reco.ConsultaAmbs; res.Errores = true; return res; - } - cps.Value = 10; + } //Prepara nombre //Pone nombre al shape en función de los ámbitos, el tratamiento, y los polígonos + timestamp @@ -89,7 +89,7 @@ namespace OliviaAddInPro.Services string msg = ""; //comienza ejecucion - if (!LanzaEjec(ModosEjec.Sectoriza, cps, out msg)) + if (!LanzaEjec(modo, out msg)) { res.Errores = true; res.msg = msg; diff --git a/ViewModel/Limpieza/PaneLimpiezaViewModel.cs b/ViewModel/Limpieza/PaneLimpiezaViewModel.cs index 711e513..342117b 100644 --- a/ViewModel/Limpieza/PaneLimpiezaViewModel.cs +++ b/ViewModel/Limpieza/PaneLimpiezaViewModel.cs @@ -173,8 +173,7 @@ namespace OliviaAddInPro string err = ""; - OliviaGlob.progrDialog.Show(); - var progSrc = new CancelableProgressorSource(OliviaGlob.progrDialog); + OliviaGlob.progrDialog.Show(); if (!Lee(out err)) { @@ -183,7 +182,7 @@ namespace OliviaAddInPro } Action ac = finEjecuta; - OliviaGlob.Limp.EjecutaAsync(modo, progSrc, ac); + OliviaGlob.Limp.EjecutaAsync(modo, ac); } public void finEjecuta(TareaRes res) { diff --git a/ViewModel/Recogida/PaneRecogidaViewModel.cs b/ViewModel/Recogida/PaneRecogidaViewModel.cs index e716a50..a7cac08 100644 --- a/ViewModel/Recogida/PaneRecogidaViewModel.cs +++ b/ViewModel/Recogida/PaneRecogidaViewModel.cs @@ -224,8 +224,7 @@ namespace OliviaAddInPro public void Ejecuta(OliviaAddInPro.Services.ModosEjec modo) { string err = ""; - OliviaGlob.progrDialog.Show(); - var progSrc = new CancelableProgressorSource(OliviaGlob.progrDialog); + OliviaGlob.progrDialog.Show(); if (!Lee(out err)) { HelperGlobal.ponMsg(err); @@ -233,7 +232,7 @@ namespace OliviaAddInPro } Action ac = finEjecuta; - OliviaGlob.Reco.EjecutaAsync(modo, progSrc, ac); + OliviaGlob.Reco.EjecutaAsync(modo, ac); } public void finEjecuta(TareaRes res)