Scrittura di String Builder su file in modo asincrono. Questo codice prende il controllo di un file, scrive un flusso su di esso e lo rilascia. Tratta le richieste da operazioni asincrone, che possono entrare in qualsiasi momento.Scrittura su file in modo thread safe
FilePath è impostato per istanze di classe (quindi l'oggetto di blocco è per istanza), ma esiste il rischio di conflitto poiché tali classi potrebbero condividere FilePath. Questo tipo di conflitto, così come tutti gli altri tipi al di fuori dell'istanza della classe, verrebbero affrontati con tentativi.
Questo codice è adatto allo scopo? C'è un modo migliore per gestire ciò che significa meno (o nessuna) dipendenza dal meccanismo di cattura e riprova?
Inoltre, come evitare di rilevare eccezioni che si sono verificate per altri motivi.
public string Filepath { get; set; }
private Object locker = new Object();
public async Task WriteToFile(StringBuilder text)
{
int timeOut = 100;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (true)
{
try
{
//Wait for resource to be free
lock (locker)
{
using (FileStream file = new FileStream(Filepath, FileMode.Append, FileAccess.Write, FileShare.Read))
using (StreamWriter writer = new StreamWriter(file, Encoding.Unicode))
{
writer.Write(text.ToString());
}
}
break;
}
catch
{
//File not available, conflict with other class instances or application
}
if (stopwatch.ElapsedMilliseconds > timeOut)
{
//Give up.
break;
}
//Wait and Retry
await Task.Delay(5);
}
stopwatch.Stop();
}
Le scritture di file effettive non sono asincrone. Intendevi che fossero? –
@StephenCleary, sì, c'erano inizialmente ma non dovresti aspettare le cose in un lucchetto, quindi ho dovuto cambiarlo. Non sono sicuro di quanto mina l'intera faccenda. –
Sembra che dovrebbe essere su codereview tbh –