Start downloading asynchronously
This commit is contained in:
parent
defed72862
commit
1e6e28cd57
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user