FieldWorkClient/Services/MinioDownloadTask.cs

160 lines
4.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Configuration;
using System.Windows;
using System.Windows.Input;
using HeBianGu.Base.WpfBase;
using Hopetry.Models;
using Hopetry.Provider;
using SqlSugar;
namespace Hopetry.Services;
using System;
using System.IO;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.ComponentModel;
using Minio;
[SugarTable(TableName = "download_task")]
public class MinioDownloadTask : INotifyPropertyChanged
{
private readonly MinioService _minio;
/// <summary>
///
/// </summary>
private CancellationTokenSource _cts;
/// <summary>
///
/// </summary>
private ManualResetEventSlim _pauseEvent = new(true);
// 任务属性绑定到UI
[SugarColumn(ColumnName = "task_id", IsPrimaryKey = true, IsIdentity = true)]
public int TaskId { get; set; }
[SugarColumn(ColumnName = "file_name")]
public string FileName { get; set; }
[SugarColumn(ColumnName = "bucket_name")]
public string Bucket { get; set; }
[SugarColumn(ColumnName = "object_key")]
public string ObjectKey { get; set; }
[SugarColumn(ColumnName = "total_size")]
public long TotalSize { get; private set; }
[SugarColumn(ColumnName = "downloaded")]
public long Downloaded { get; private set; }
[SugarColumn(ColumnName = "file_path")]
public string FilePath { get; set; }
[SugarColumn(ColumnName = "status")] public string Status { get; private set; } = "等待中";
[SugarColumn(IsIgnore = true)]
public string Progress
{
get { return TotalSize == 0 ? "0%" : $"{(Downloaded * 100 / TotalSize):0.0}%"; }
}
[SugarColumn(IsIgnore = true)] public ICommand PauseCommand { get; }
[SugarColumn(IsIgnore = true)] public ICommand CancelCommand { get; }
public MinioDownloadTask()
{
PauseCommand = new CustomCommand(OnPause);
CancelCommand = new CustomCommand(OnCancel);
}
public MinioDownloadTask(MinioService minio, string bucket, string objectKey)
{
_minio = minio;
Bucket = bucket;
ObjectKey = objectKey;
FileName = Path.GetFileName(objectKey);
FilePath = "f:\\dest";
PauseCommand = new CustomCommand(OnPause);
CancelCommand = new CustomCommand(OnCancel);
}
/// <summary>
/// 下载
/// </summary>
/// <param name="savePath"></param>
public async Task StartDownload()
{
_cts = new CancellationTokenSource();
try
{
Status = "下载中";
var updateTask = new MinioDownloadTask
{
TaskId = TaskId,
Status = Status
};
using (var client = SqlSugarConfig.GetSqlSugarScope())
{
await client.Updateable(updateTask).IgnoreNullColumns().ExecuteCommandAsync();
}
Console.WriteLine($"{ObjectKey}文件下载中...");
updateTask.Status = "下载中";
await _minio.DownLoadObject(Bucket, ObjectKey, FilePath, "");
Status = "已完成";
updateTask.Status = Status;
using (var client = SqlSugarConfig.GetSqlSugarScope())
{
await client.Updateable(updateTask).IgnoreNullColumns().ExecuteCommandAsync();
}
Console.WriteLine($"文件{ObjectKey}下载完成");
}
catch (OperationCanceledException)
{
Status = "已取消";
}
catch (Exception ex)
{
Status = $"错误:{ex.Message}";
}
finally
{
_pauseEvent.Dispose();
OnPropertyChanged(nameof(Status));
}
}
private void OnPause()
{
if (Status == "下载中")
{
_pauseEvent.Reset();
Status = "已暂停";
}
else if (Status == "已暂停")
{
_pauseEvent.Set();
Status = "下载中";
}
OnPropertyChanged(nameof(Status));
}
private void OnCancel()
{
_cts?.Cancel();
Status = "已取消";
OnPropertyChanged(nameof(Status));
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}