From a6bc7552f4500d99a0a895d96a98b4a468156379 Mon Sep 17 00:00:00 2001
From: doudou0720 <98651603+doudou0720@users.noreply.github.com>
Date: Sun, 22 Feb 2026 23:53:12 +0800
Subject: [PATCH] =?UTF-8?q?feat(Upload):=E8=A7=A3=E8=80=A6Dlass=E4=B8=8A?=
=?UTF-8?q?=E4=BC=A0=E5=B9=B6=E4=BD=BF=E7=94=A8UploadHelper=E6=8E=A5?=
=?UTF-8?q?=E7=AE=A1=20(#380)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat(Upload):解耦Dlass笔记上传
Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com>
* fix(上传): 修复多线程环境下的上传提供者管理问题
添加线程同步锁确保上传提供者列表的线程安全
修改AutoUploadDelayMinutes属性确保最小值为0
优化提供者注册逻辑避免重复注册
Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com>
---------
Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com>
---
Ink Canvas/App.xaml.cs | 11 ++
Ink Canvas/Helpers/UploadHelper.cs | 188 ++++++++++++++++++++++
Ink Canvas/MainWindow_cs/MW_Screenshot.cs | 18 +--
Ink Canvas/Resources/Settings.cs | 10 +-
4 files changed, 213 insertions(+), 14 deletions(-)
create mode 100644 Ink Canvas/Helpers/UploadHelper.cs
diff --git a/Ink Canvas/App.xaml.cs b/Ink Canvas/App.xaml.cs
index dc941a74..38888ffa 100644
--- a/Ink Canvas/App.xaml.cs
+++ b/Ink Canvas/App.xaml.cs
@@ -1148,6 +1148,17 @@ namespace Ink_Canvas
LogHelper.WriteLogToFile($"启动IPC监听器时出错: {ex.Message}", LogHelper.LogType.Error);
}
+ // 初始化上传帮助类
+ try
+ {
+ LogHelper.WriteLogToFile("初始化上传帮助类");
+ Helpers.UploadHelper.Initialize();
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"初始化上传帮助类时出错: {ex.Message}", LogHelper.LogType.Error);
+ }
+
}
private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
diff --git a/Ink Canvas/Helpers/UploadHelper.cs b/Ink Canvas/Helpers/UploadHelper.cs
new file mode 100644
index 00000000..cef66c61
--- /dev/null
+++ b/Ink Canvas/Helpers/UploadHelper.cs
@@ -0,0 +1,188 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace Ink_Canvas.Helpers
+{
+ ///
+ /// 上传提供者接口
+ ///
+ public interface IUploadProvider
+ {
+ ///
+ /// 提供者名称
+ ///
+ string Name { get; }
+
+ ///
+ /// 是否启用
+ ///
+ bool IsEnabled { get; }
+
+ ///
+ /// 上传文件
+ ///
+ /// 文件路径
+ /// 是否上传成功
+ Task UploadAsync(string filePath);
+ }
+
+ ///
+ /// Dlass上传提供者
+ ///
+ public class DlassUploadProvider : IUploadProvider
+ {
+ ///
+ /// 提供者名称
+ ///
+ public string Name => "Dlass";
+
+ ///
+ /// 是否启用
+ ///
+ public bool IsEnabled => MainWindow.Settings?.Dlass?.IsAutoUploadNotes ?? false;
+
+ ///
+ /// 上传文件
+ ///
+ /// 文件路径
+ /// 是否上传成功
+ public async Task UploadAsync(string filePath)
+ {
+ return await DlassNoteUploader.UploadNoteFileAsync(filePath);
+ }
+ }
+
+
+
+ ///
+ /// 上传帮助类
+ ///
+ public static class UploadHelper
+ {
+ private static readonly List _providers = new List();
+ private static bool _initialized;
+ private static readonly object s_sync = new object();
+
+ ///
+ /// 初始化上传帮助类
+ ///
+ public static void Initialize()
+ {
+ lock (s_sync)
+ {
+ if (_initialized)
+ return;
+
+ // 注册默认上传提供者
+ RegisterProviderInternal(new DlassUploadProvider());
+
+ _initialized = true;
+ }
+ }
+
+ ///
+ /// 注册上传提供者
+ ///
+ /// 上传提供者
+ public static void RegisterProvider(IUploadProvider provider)
+ {
+ if (provider == null)
+ return;
+
+ lock (s_sync)
+ {
+ RegisterProviderInternal(provider);
+ }
+ }
+
+ private static void RegisterProviderInternal(IUploadProvider provider)
+ {
+ if (provider != null)
+ {
+ bool providerExists = _providers.Any(p => p.GetType() == provider.GetType());
+ if (!providerExists)
+ {
+ _providers.Add(provider);
+ }
+ }
+ }
+
+ ///
+ /// 上传文件到所有启用的提供者
+ ///
+ /// 文件路径
+ /// 是否至少有一个提供者上传成功
+ public static async Task UploadFileAsync(string filePath)
+ {
+ if (!_initialized)
+ {
+ Initialize();
+ }
+
+ List providersSnapshot;
+ lock (s_sync)
+ {
+ providersSnapshot = new List(_providers);
+ }
+
+ bool anySuccess = false;
+
+ foreach (var provider in providersSnapshot)
+ {
+ try
+ {
+ if (provider.IsEnabled)
+ {
+ bool success = await provider.UploadAsync(filePath);
+ if (success)
+ {
+ anySuccess = true;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"使用 {provider.Name} 上传失败: {ex}", LogHelper.LogType.Error);
+ }
+ }
+
+ return anySuccess;
+ }
+
+ ///
+ /// 获取所有上传提供者
+ ///
+ /// 上传提供者列表
+ public static List GetProviders()
+ {
+ if (!_initialized)
+ {
+ Initialize();
+ }
+
+ lock (s_sync)
+ {
+ return new List(_providers);
+ }
+ }
+
+ ///
+ /// 获取所有启用的上传提供者
+ ///
+ /// 启用的上传提供者列表
+ public static List GetEnabledProviders()
+ {
+ if (!_initialized)
+ {
+ Initialize();
+ }
+
+ lock (s_sync)
+ {
+ return _providers.FindAll(p => p.IsEnabled);
+ }
+ }
+ }
+}
diff --git a/Ink Canvas/MainWindow_cs/MW_Screenshot.cs b/Ink Canvas/MainWindow_cs/MW_Screenshot.cs
index fe5b694f..b944299b 100644
--- a/Ink Canvas/MainWindow_cs/MW_Screenshot.cs
+++ b/Ink Canvas/MainWindow_cs/MW_Screenshot.cs
@@ -58,7 +58,7 @@ namespace Ink_Canvas
var path = savePath;
var hideNotification = isHideNotification;
- _ = Task.Run(() =>
+ _ = Task.Run(async () =>
{
try
{
@@ -84,11 +84,8 @@ namespace Ink_Canvas
Dispatcher.Invoke(() => ShowNotification($"截图成功保存至 {path}"));
}
- if (Settings?.Dlass?.AutoUploadDelayMinutes > 0)
- {
- Task.Delay(TimeSpan.FromMinutes(Settings.Dlass.AutoUploadDelayMinutes)).GetAwaiter().GetResult();
- Helpers.DlassNoteUploader.UploadNoteFileAsync(path).GetAwaiter().GetResult();
- }
+ // 使用上传帮助类上传到所有启用的服务
+ await Helpers.UploadHelper.UploadFileAsync(path);
}
catch (Exception ex)
{
@@ -365,13 +362,8 @@ namespace Ink_Canvas
{
try
{
- var delayMinutes = Settings?.Dlass?.AutoUploadDelayMinutes ?? 0;
- if (delayMinutes > 0)
- {
- await Task.Delay(TimeSpan.FromMinutes(delayMinutes));
- }
-
- await Helpers.DlassNoteUploader.UploadNoteFileAsync(savePath);
+ // 使用上传帮助类上传到所有启用的服务
+ await Helpers.UploadHelper.UploadFileAsync(savePath);
}
catch (Exception)
{
diff --git a/Ink Canvas/Resources/Settings.cs b/Ink Canvas/Resources/Settings.cs
index d0a55b01..34372fea 100644
--- a/Ink Canvas/Resources/Settings.cs
+++ b/Ink Canvas/Resources/Settings.cs
@@ -31,6 +31,7 @@ namespace Ink_Canvas
public CameraSettings Camera { get; set; } = new CameraSettings();
[JsonProperty("dlass")]
public DlassSettings Dlass { get; set; } = new DlassSettings();
+
[JsonProperty("security")]
public Security Security { get; set; } = new Security();
}
@@ -851,7 +852,14 @@ namespace Ink_Canvas
[JsonProperty("isAutoUploadNotes")]
public bool IsAutoUploadNotes { get; set; } = false;
+ private int _autoUploadDelayMinutes = 0;
[JsonProperty("autoUploadDelayMinutes")]
- public int AutoUploadDelayMinutes { get; set; } = 0;
+ public int AutoUploadDelayMinutes
+ {
+ get { return _autoUploadDelayMinutes; }
+ set { _autoUploadDelayMinutes = Math.Max(0, value); }
+ }
}
+
+
}