protected IEnumerator<object> SnapshotIOTask()
{
ActivityIndicator.Item progress = null;
IFuture previousSnapshot = null;
while (true) {
if ((SnapshotLoadQueue.Count <= 0) && (previousSnapshot != null))
yield return previousSnapshot;
if (SnapshotLoadQueue.Count <= 0) {
SnapshotLoadState.Count = 0;
if (progress != null) {
progress.Dispose();
progress = null;
}
}
var f = SnapshotLoadQueue.Dequeue();
using (f)
yield return f;
var filename = f.Result;
if (progress == null)
progress = Activities.AddItem("Loading snapshots");
using (var fda = new FileDataAdapter(
filename, FileMode.Open,
FileAccess.Read, FileShare.Read, 1024 * 128
)) {
var maximum = SnapshotLoadState.Count + Math.Max(0, SnapshotLoadQueue.Count) + 1;
progress.Maximum = maximum;
progress.Progress = Math.Min(maximum, SnapshotLoadState.Count);
var fBytes = fda.ReadToEnd();
yield return fBytes;
var fText = Future.RunInThread(
() => Encoding.ASCII.GetString(fBytes.Result)
);
yield return fText;
var text = fText.Result;
fBytes = null;
fText = null;
// Wait for the last snapshot load we triggered to finish
if (previousSnapshot != null)
yield return previousSnapshot;
previousSnapshot = Scheduler.Start(
FinishLoadingSnapshot(filename, text), TaskExecutionPolicy.RunAsBackgroundTask
);
text = null;
}
}
}