15 messaggi dal 14 luglio 2010
Buongiorno a tutti, ecco il mio problema della domenica:
ho tre file xml e il primo (doc1) contiene una lista di stringhe.
Un metodo statico legge le stringhe da doc1.xml, ne prende una alla volta, esegue un'operazione quindi cancella la stringa da doc1 e la scrive su doc2. Se qualcosa va storto la stringa è scritta su doc3.


static void MioMetodo(){
List = doc1.Descendants("Order")
                .Select(d => d.Value)
                .ToList();

for (int i = 0; i < List.Count; i++)
            {
                try
                {
                    var item = (from m in doc1.Elements("list").Elements("Order")
                                    where m.Value == List[i]
                                    select m);

                    item.Remove();

                    doc1.Save(path1);
                    var1 = doc1.Root.Descendants("Orde").Count();


                    //DoSomethingHeavy with List[i]

                    doc2.Element("list2").Add(new XElement("Order", List[i]));
                    doc2.Save(path2);

                        
                     var2= doc2.Root.Descendants("Order").Count();
                    
                }
                catch (Exception)
                {
        doc3.Element("list3").Add(new XElement("Order", List[i]));
                    doc3.Save(path3);

                    var3 = doc3.Root.Descendants("Order").Count();
                    
                }
}

sto usando una form windows application. Tramite due bottoni Start e Stop vorrei avere la possibilità di eseguire il miometodo e all'occorenza, di fermarlo. Ho provato ad usare un backgroundworker (primissime armi!!!). eseguo il metodo con .RunWorkerAsync(). Come devo usare .CancelAsync() per bloccarlo ma solo quando il blocco try-catch sia stato interamente eseguito per la stringa n-esima? Al momento si blocca ma lo fa all'interno del blocco quindi rimuove la stringa n-esima da doc1 ma non la scrive su doc2 o su doc3.
Nell'evento DoWork, dove devi inserire il codice da eseguire in asincrono, nell'argomento e hai una proprietà Cancel. Ad ogni for che fai monitorizza la proprietà Cancel. Se è true vuol dire che hai chiamato CancelAsync, perciò interrompi il ciclo ed esci.
Il CancelAsync non ferma l'esecuzione del codice, perché sei te a dover intervenire, ma se vuoi proprio essere sicuro che in qualsiasi caso comunque un certo codice venga eseguito, usa try/finally.

Ciao

Il mio blog
Homepage
15 messaggi dal 14 luglio 2010
Chiarissimo, grazie mille! ....almeno cosi' mi sembra a quest'ora ...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.