Jest program którego zadaniem jest odbieranie strumienia bitów (po TCP) i zapisywanie ich do odpowiednich plików. Dostaję dane partiami, kilkaset razy, za każdym razem 1000 bajtów.
Aby zapisać dane do pliku, najpierw (zanim dostanę jakiekolwiek dane) tworzę FileStream:
_targetFileStream = File.Open(TemporalFilePathAbsolute, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
Następnie, za każdym razem jak przyjdą dane, wywoływana jest ta funkcja:
public async Task WritePartToFileAsync(int partNumber, byte[] partContent)
{
FileTransferBegan = true;
WaitingForValidDownloadSource = false;
_logger.LogInformation("Writing part " + partNumber + " to file " + TargetFilePathAbsolute.LocalPath);
if (_targetFileStream == null)
{
return;
}
try
{
int startingPoint = partNumber * TcpConnectionsManager.SizeOfPart;
int dataToWrite = Math.Min(partContent.Length, TcpConnectionsManager.SizeOfPart);
_targetFileStream.Seek(startingPoint, SeekOrigin.Begin);
await _targetFileStream.WriteAsync(partContent, 0, dataToWrite);
ReceivedParts[partNumber] = true;
ReceivedPartsCounter++;
if (ReceivedPartsCounter == ExpectedNumberOfParts)
{
finishDownloading();
}
}
catch (Exception e)
{
_logger.LogError("Writing failed: " + e.Message);
//throw new Exception("Writing to file failed. " + e.Message);
}
}
Problem polega na tym, że bardzo często program rzuca w tej funkcji wyjątkami. Najczęściej jest tak, że FileStream zostaje prawidłowo otwarty, następnie dane są prawidłowo zapisywane tak w 1/3, czasem w połowie, po czym nagle okazuje się że plik jest wykorzystywany przez inny proces, albo FileStream jest zamknięty (closed).
Nie mogę dojść dlaczego tak się dzieje. Operacji na plikach dokonuję tylko w jednej klasie, każda instancja tej klasy zajmuje się jednym plikiem. FileStream jest zmienną prywatną, więc nic z zewnątrz nie może jej "zamknąć", a w ramach klasy na 100% jej przedwcześnie nie zamykam. Plik otwieram z parametrem " FileShare.None" co w teorii powinno powstrzymać inne procesy przed używaniem tego pliku na czas kiedy go modyfikuję.
Całość dzieje się pozornie losowo. Czasem działa ok, czasem wcale, czasem plik zapisany jest w połowie.
Ma ktoś jakiś pomysł co tu może być problemem?