PDA

View Full Version : [C#/.NET] Eccezione di Accesso Negato causata da Windows Search?


alex783
16-04-2009, 19:42
In questi giorni di studio, sto affrontando il problema delle eccezioni e ho scoperto - con piacere - che il C# supporta anche l'istruzione goto.

Ora, a pensarci bene, l'istruzione goto potrebbe tornare utile nelle eccezioni, ad esempio per uscire da un blocco catch e provare di nuovo ad eseguire le istruzioni contenute nel blocco try, disponendo un'etichetta appena prima dell'istruzione try.

Questa soluzione mi č stata utile per risolvere uno strano problema che ho avuto fino ad oggi pomeriggio: quando provavo ad eliminare dei file situati nella cartella Documenti, a volte (e non sempre) mi veniva sollevata un'eccezione di "Accesso negato".

E' possibile che sia dovuto a Windows Search di Vista? magari quando provo ad eliminare questi file, in quel momento sono occupati dall'indicizzazione, č possibile?

Naturalmente, per evitare cicli di loop all'infinito, ho messo un contatore, per cui i tentativi sono limitati - per mia scelta - a 5. Fin'ora pare che questa soluzione funzioni, perņ non mi piace, mi sembra troppo un "inciucio" :D

Suggerimenti? :stordita:

Grazie a tutti... ;)

gugoXX
17-04-2009, 11:44
Ciao.

Come tanti qui dentro penso non voto per il goto comunque mai per codice utente.

Per il tuo specifico problema non saprei dirti perche' il file risulti talvolta inaccessibile.
Per una possibile "genrica" soluzione simile alla tua, ti propongo la seguente:


public static class Utility
{
public static bool TryThisForNTimes<T>(Action<T> method, T param,
int NTimes,int Throttling)
{
for(int u=0;u<NTimes;u++)
{
try
{
method(param);
return true;
}
catch
{
Thread.Sleep(Throttling);
}
}
return false;
}
}


E' una funzione generica, che accetta
- come primo parametro un metodo
- come secondo parametro il "parametro che verra' passato al metodo" di tipo generico.
- come terzo parametro il numero di volte che si dovra' tentare l'esecuzione del metodo (primo parametro)
- come quarto parametro il tempo di attesa tra un tentativo e l'altro in Millisecondi.
Restiuira' true o false a seconda che il metodo sia stato effettivamente eseguito con successo oppure no.

La funzione si potra' usare cosi':

bool executed = Utility.TryThisForNTimes(File.Delete, "Pippo.txt", 5, 1000);


E potra' essere usata tutte le volte che si contera' di eseguire il Throttling su funzioni che accettano uno ed un solo parametro, di qualunque tipo esso sia
Ad esempio chiamate a WebService Remoti, che talvolta possono non essere disponibili e per i quali si vuole effettuare almeno un paio di tentativi (talvolta la prima volta in assoluto la risposta e' negativa per sole questioni di negoziazione e di latenze di rete, e dalla seconda in poi invece il risultato risulta essere positivo)
E per le quali non serve il parametro di ritorno, se presente, altrimenti si dovra' studiare altro, essendo che viene restituita solo l'informazione sull'avvenuta esecuzione o meno del metodo, e non il suo eventuale risultato.

banryu79
17-04-2009, 12:42
Bella gugoXX!
Si puņ fare una cosa simile anche in Java?
Come si potrebbe superare la mancanza della classe Action del C# che rappresenta un metodo?

Scusate l'OT ma la cosa č interessante.

wizard1993
17-04-2009, 13:06
direi con un interfaccia; il polimorfismo i questo caso aiuta