Wymóg: Nie ma gwarancji, że kilka instancji tego samego programu nie będzie chciało czytać/pisać do tego samego pliku na dysku niemal w tym samym czasie. Napisać program tak, by nie stanowiło to problemu.
Zastanawiam się, jak napisać tu test?
Mamy na przykład takie miejsce w kodzie:
public class MojaKlasa
{
public void MojaMetoda()
{
using (var str = File.Open(plik, FileMode.CreateNew, FileAccess.Write, FileShare.None)
using (var writer = new StreamWriter(str))
{
writer.Write(cośtam);
}
}
}
Widać, że jest tu gorący punkt.
Pomysł na testowanie mam taki, ale wydaje mi się on być brzydki:
public class MojaKlasa
{
private bool blokujPlikDługo;
public MojaKlasa(bool uwagaTenParametrSłużyTylkoDoTestowaniaNieUżywaćRozwalaKlasęISprawiaŻeDziałaWściekleDługo=false) =>
blokujPlikDługo = uwagaTenParametrSłużyTylkoDoTestowaniaNieUżywaćRozwalaKlasęISprawaŻeDziałaWściekleDługo;
public void MojaMetoda()
{
using (var str = File.Open(plik, FileMode.CreateNew, FileAccess.Write, FileShare.None)
using (var writer = new StreamWriter(str))
{
if(blokujPlikDługo)
Thread.Sleep(500);
writer.Write(cośtam);
}
}
}
I teraz w teście uruchamiamy 2 wątki: jeden wątek tworzy instancję MojaKlasa
z tym parametrem ustawionym na true
i odpala MojaMetoda
, drugi wątek wpierw czeka 250ms a następnie tworzy instancję MojejKlasy
z parametremm ustawionym na false
i odpala MojąMetodę
. Sprawdzamy, czy drugi wątek walnie wyjątkiem jak należy i czy plik
jest zapisany poprawnie (tylko przez jeden wątek), bez krzaczków.
Jaka jest alternatywa?