下载任务数并发控制(有一点点bug)

dev2.0
陈伟 2025-04-27 17:02:59 +08:00
parent cf09403486
commit a6a8c0a89b
3 changed files with 71 additions and 19 deletions

View File

@ -25,9 +25,11 @@ namespace HeBianGu.App.Disk
{
public new static ComponentResourceKey Custom
{
get => new ComponentResourceKey(typeof (LinkWindowBase), (object) "S.Window.Link.Custom");
get => new ComponentResourceKey(typeof(LinkWindowBase), (object)"S.Window.Link.Custom");
}
public static ComponentResourceKey WaitingPercent => new ComponentResourceKey(typeof(ProgressBarKeys), "S.ProgressBar.Custom");
public static ComponentResourceKey WaitingPercent =>
new ComponentResourceKey(typeof(ProgressBarKeys), "S.ProgressBar.Custom");
protected override MainWindowBase CreateMainWindow(StartupEventArgs e)
{
@ -137,11 +139,12 @@ namespace HeBianGu.App.Disk
{
var tempSetting = new SystemSetting();
tempSetting.TaskCount = 3;
tempSetting.SyncDir = Path.Combine(SelectDrive(),"HopetryBoxData");
tempSetting.SyncDir = Path.Combine(SelectDrive(), "HopetryBoxData");
if (!Directory.Exists(tempSetting.SyncDir))
{
Directory.CreateDirectory(tempSetting.SyncDir);
}
xmlSerializerService.Save("./settings.xml", tempSetting);
}
@ -297,13 +300,27 @@ namespace HeBianGu.App.Disk
}
}
[Displayer(Name = "下载设置", GroupName = "通用设置")]
public class DownloadSetting : LazySettingInstance<DownloadSetting>
{
private int _maxConcurrent;
[DefaultValue(3)]
[Display(Name = "下载并行任务数")]
public int MaxConcurrent
{
get => _maxConcurrent;
set
{
if (_maxConcurrent == value) return;
_maxConcurrent = value;
RaisePropertyChanged();
}
}
private string _downDir;
[Display(Name = "下载目录")]
public string DownDir
{
@ -315,8 +332,9 @@ namespace HeBianGu.App.Disk
RaisePropertyChanged();
}
}
private bool _isSelect;
[DefaultValue(false)]
[Display(Name = "设置为默认下载目录")]
public bool IsSelect
@ -330,7 +348,7 @@ namespace HeBianGu.App.Disk
}
}
}
[Displayer(Name = "同步设置", GroupName = "通用设置")]
public class SyncSetting : LazySettingInstance<SyncSetting>

View File

@ -433,7 +433,7 @@ namespace Hopetry.Services
//var localPath = Path.Combine(filePath, objectKey.Replace('/', Path.DirectorySeparatorChar));
var localPath = Path.Combine(filePath,
objectKey[(objectKey.LastIndexOf('/') + 1)..]);
GetObjectArgs getObjectArgs = new GetObjectArgs()
var getObjectArgs = new GetObjectArgs()
.WithBucket(string.IsNullOrEmpty(bucketName) ? _bucketName : bucketName)
.WithObject(objectKey)
.WithOffsetAndLength(offset, totalBytes - offset)
@ -477,7 +477,6 @@ namespace Hopetry.Services
}
}
fileStream.Close();
}

View File

@ -6,6 +6,7 @@ using System.IO;
using System.Windows;
using System.Windows.Data;
using System.Windows.Input;
using HeBianGu.App.Disk;
using HeBianGu.Base.WpfBase;
using HeBianGu.Service.Mvc;
using Hopetry.Models;
@ -155,7 +156,7 @@ public class DownViewModel : MvcViewModelBase
}
}
private int _maxConcurrent = 3;
private int _maxConcurrent;
public int MaxConcurrent
{
@ -164,9 +165,9 @@ public class DownViewModel : MvcViewModelBase
{
if (value < 1) value = 1;
if (_maxConcurrent == value) return;
var delta = value - _maxConcurrent;
_maxConcurrent = value;
//AdjustConcurrency();
AdjustConcurrency(delta);
RaisePropertyChanged();
}
}
@ -204,8 +205,16 @@ public class DownViewModel : MvcViewModelBase
// 加载未完成任务
LoadRunningTasks();
ClearFinishedCommand = new CustomCommand(DoClearFinishedCommand);
Console.WriteLine($"初始下载任务并发数:{DownloadSetting.Instance.MaxConcurrent}");
// 启动任务处理线程
_semaphore = new SemaphoreSlim(MaxConcurrent);
_maxConcurrent = DownloadSetting.Instance.MaxConcurrent;
_semaphore = new SemaphoreSlim(DownloadSetting.Instance.MaxConcurrent);
DownloadSetting.Instance.PropertyChanged += (sender, args) =>
{
Console.WriteLine($"当前下载任务并发数:{DownloadSetting.Instance.MaxConcurrent}");
MaxConcurrent = DownloadSetting.Instance.MaxConcurrent;
};
new Thread(ProcessTasksLoop) { IsBackground = true }.Start();
}
@ -291,7 +300,7 @@ public class DownViewModel : MvcViewModelBase
public void RefreshHeader()
{
RunningTaskHeader = $"下载中({RunningTasks.Count}";
ViewModelLocator.SendViewModel.DownLinkAction.DisplayName = $"下载 {RunningTasks.Count}" ;
ViewModelLocator.SendViewModel.DownLinkAction.DisplayName = $"下载 {RunningTasks.Count}";
FinishedTaskHeader = $"已完成({FinishedTasks.Count}";
}
@ -428,22 +437,43 @@ public class DownViewModel : MvcViewModelBase
}
}
private void AdjustConcurrency()
private void AdjustConcurrency(int delta)
{
Console.WriteLine("AdjustConcurrency 被调用了");
lock (_semaphore)
{
// 调整信号量容量
var delta = _maxConcurrent - _semaphore.CurrentCount;
if (delta > 0)
{
for (int i = 0; i < delta; i++)
_semaphore.Release(delta);
}
else
{
// todo
var runTask = _runningTasks.Where(task => task is { Status: "下载中", StopDownTs: not null });
var num = -delta;
foreach (var item in runTask)
{
_semaphore.Release();
_semaphore.WaitAsync();
item.StopDownTs.Cancel();
item.Status = "等待中";
// 速度及剩余时间(视图显示信息)
item.Speed = "等待中";
_taskQueue.Enqueue(item);
if (num-- == 1)
{
break;
}
}
}
}
}
/// <summary>
/// 打开文件夹
/// </summary>
/// <param name="para"></param>
public void DoOpenDownItemFolder(MinioDownloadTask para)
{
switch (para.Type)
@ -473,6 +503,10 @@ public class DownViewModel : MvcViewModelBase
}
}
/// <summary>
/// 任务取消
/// </summary>
/// <param name="item"></param>
public void DoCancelDownload(MinioDownloadTask item)
{
Console.WriteLine("取消下载");
@ -484,6 +518,7 @@ public class DownViewModel : MvcViewModelBase
}
item.Status = "删除中";
item.Speed = "删除中";
using var client = SqlSugarConfig.GetSqlSugarScope();
client.Deleteable<MinioDownloadTask>().Where(x => x.TaskId == item.TaskId).ExecuteCommand();
RunningTasks.Remove(item);