internal ImageFilePart FetchNextPartForUpload(Stream imageFileStream, ref byte[] buffer)
{
ImageFilePart nextPart = null;
try
{
lock (_syncLock)
{
if (_failedUploads > 0) // ensures all workers quit asap
return null;
if (_nextPartForUpload < PartInstances.Count)
{
nextPart = PartInstances[_nextPartForUpload];
var offset = 0;
var bytesRemaining = (int)nextPart.ByteRange.Extent;
while (bytesRemaining > 0)
{
var bytesRead = imageFileStream.Read(buffer, offset, bytesRemaining);
if (bytesRead > 0)
{
offset += bytesRead;
bytesRemaining -= bytesRead;
}
else
{
throw new InvalidOperationException("Encountered unexpected end of stream");
}
}
_nextPartForUpload++;
}
}
}
catch
{
Interlocked.Increment(ref _failedUploads);
}
return nextPart;
}