Start downloading asynchronously

This commit is contained in:
Michael Bucari-Tovo 2023-02-18 22:37:11 -07:00
parent defed72862
commit 1e6e28cd57
3 changed files with 9 additions and 17 deletions

View File

@ -3,6 +3,7 @@ using Dinah.Core.Net.Http;
using Dinah.Core.StepRunner; using Dinah.Core.StepRunner;
using FileManager; using FileManager;
using System; using System;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -66,6 +67,7 @@ namespace AaxDecrypter
public async Task<bool> RunAsync() public async Task<bool> RunAsync()
{ {
await InputFileStream.BeginDownloadingAsync();
var progressTask = Task.Run(reportProgress); var progressTask = Task.Run(reportProgress);
AsyncSteps[$"Cleanup"] = CleanupAsync; AsyncSteps[$"Cleanup"] = CleanupAsync;

View File

@ -136,10 +136,10 @@ namespace AaxDecrypter
/// <summary> Begins downloading <see cref="Uri"/> to <see cref="SaveFilePath"/> in a background thread. </summary> /// <summary> Begins downloading <see cref="Uri"/> to <see cref="SaveFilePath"/> in a background thread. </summary>
/// <returns>The downloader <see cref="Task"/></returns> /// <returns>The downloader <see cref="Task"/></returns>
private Task BeginDownloading() public async Task BeginDownloadingAsync()
{ {
if (ContentLength != 0 && WritePosition == ContentLength) if (ContentLength != 0 && WritePosition == ContentLength)
return Task.CompletedTask; return;
if (ContentLength != 0 && WritePosition > ContentLength) if (ContentLength != 0 && WritePosition > ContentLength)
throw new WebException($"Specified write position (0x{WritePosition:X10}) is larger than {nameof(ContentLength)} (0x{ContentLength:X10})."); throw new WebException($"Specified write position (0x{WritePosition:X10}) is larger than {nameof(ContentLength)} (0x{ContentLength:X10}).");
@ -149,7 +149,7 @@ namespace AaxDecrypter
foreach (var header in RequestHeaders) foreach (var header in RequestHeaders)
request.Headers.Add(header.Key, header.Value); request.Headers.Add(header.Key, header.Value);
var response = new HttpClient().Send(request, HttpCompletionOption.ResponseHeadersRead, _cancellationSource.Token); var response = await new HttpClient().SendAsync(request, HttpCompletionOption.ResponseHeadersRead, _cancellationSource.Token);
if (response.StatusCode != HttpStatusCode.PartialContent) if (response.StatusCode != HttpStatusCode.PartialContent)
throw new WebException($"Server at {Uri.Host} responded with unexpected status code: {response.StatusCode}."); throw new WebException($"Server at {Uri.Host} responded with unexpected status code: {response.StatusCode}.");
@ -159,11 +159,11 @@ namespace AaxDecrypter
if (WritePosition == 0) if (WritePosition == 0)
ContentLength = response.Content.Headers.ContentLength.GetValueOrDefault(); ContentLength = response.Content.Headers.ContentLength.GetValueOrDefault();
var networkStream = response.Content.ReadAsStream(_cancellationSource.Token); var networkStream = await response.Content.ReadAsStreamAsync(_cancellationSource.Token);
_downloadedPiece = new EventWaitHandle(false, EventResetMode.AutoReset); _downloadedPiece = new EventWaitHandle(false, EventResetMode.AutoReset);
//Download the file in the background. //Download the file in the background.
return Task.Run(() => DownloadFile(networkStream), _cancellationSource.Token); _backgroundDownloadTask = Task.Run(() => DownloadFile(networkStream), _cancellationSource.Token);
} }
/// <summary> Download <see cref="Uri"/> to <see cref="SaveFilePath"/>.</summary> /// <summary> Download <see cref="Uri"/> to <see cref="SaveFilePath"/>.</summary>
@ -247,14 +247,7 @@ namespace AaxDecrypter
public override bool CanWrite => false; public override bool CanWrite => false;
[JsonIgnore] [JsonIgnore]
public override long Length public override long Length => ContentLength;
{
get
{
_backgroundDownloadTask ??= BeginDownloading();
return ContentLength;
}
}
[JsonIgnore] [JsonIgnore]
public override long Position { get => _readFile.Position; set => Seek(value, SeekOrigin.Begin); } public override long Position { get => _readFile.Position; set => Seek(value, SeekOrigin.Begin); }
@ -274,8 +267,6 @@ namespace AaxDecrypter
public override int Read(byte[] buffer, int offset, int count) public override int Read(byte[] buffer, int offset, int count)
{ {
_backgroundDownloadTask ??= BeginDownloading();
var toRead = Math.Min(count, Length - Position); var toRead = Math.Min(count, Length - Position);
WaitToPosition(Position + toRead); WaitToPosition(Position + toRead);
return IsCancelled ? 0 : _readFile.Read(buffer, offset, count); return IsCancelled ? 0 : _readFile.Read(buffer, offset, count);

View File

@ -26,8 +26,7 @@ namespace AaxDecrypter
protected override async Task<bool> Step_DownloadAndDecryptAudiobookAsync() protected override async Task<bool> Step_DownloadAndDecryptAudiobookAsync()
{ {
// MUST put InputFileStream.Length first, because it starts background downloader. while (InputFilePosition < InputFileStream.Length && !InputFileStream.IsCancelled)
while (InputFileStream.Length > InputFilePosition && !InputFileStream.IsCancelled)
await Task.Delay(200); await Task.Delay(200);
if (IsCanceled) if (IsCanceled)