Я прочитал этот пост в блоге, упомянутый CorneM, но я не слишком заинтересовался реализацией.
Вместо этого я поместил в подкласс FileStream так, что он вызывал события так часто, что его читали, и предоставил мойПреобразование потока файлов в метод UploadFromStream в клиенте хранилища Azure в SDK.Гораздо чище, ИМХО
public delegate void PositionChanged(long position);
public class ProgressTrackingFileStream: FileStream
{
public int AnnounceEveryBytes { get; set; }
private long _lastPosition = 0;
public event PositionChanged StreamPositionUpdated;
// implementing other methods that the storage client may call, like ReadByte or Begin/EndRead is left as an exercise for the reader
public override int Read(byte[] buffer, int offset, int count)
{
int i = base.Read(buffer, offset, count);
MaybeAnnounce();
return i;
}
private void MaybeAnnounce()
{
if (StreamPositionUpdated != null && (base.Position - _lastPosition) > AnnounceEveryBytes)
{
_lastPosition = base.Position;
StreamPositionUpdated(_lastPosition);
}
}
public ProgressTrackingFileStream(string path, FileMode fileMode) : base(path, fileMode)
{
AnnounceEveryBytes = 32768;
}
}
А потом использовал его вот так (_container - это мой контейнер хранения Azure, файл - это FileInfo для моего локального файла):
CloudBlockBlob blockBlob = _container.GetBlockBlobReference(blobPath);
using (ProgressTrackingFileStream ptfs = new ProgressTrackingFileStream(file.FullName, FileMode.Open))
{
ptfs.StreamPositionUpdated += ptfs_StreamPositionUpdated;
blockBlob.UploadFromStream(ptfs);
}