From 119c294f0107aaebb0036f1663fcf0f4a77da8e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Sat, 31 May 2025 23:33:56 +0800 Subject: [PATCH] fix: enhance RunTask method to support nullable CancellationToken and add linked cancellation token functionality --- .../Core/Script/Dependence/Dispatcher.cs | 98 +++++++++---------- 1 file changed, 47 insertions(+), 51 deletions(-) diff --git a/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs b/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs index 99b5026a..9a281126 100644 --- a/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs +++ b/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs @@ -79,6 +79,15 @@ public class Dispatcher } } + public async Task RunTask(SoloTask soloTask, CancellationTokenSource customCts) + { + // 创建链接的取消令牌源,任何一个取消都会触发 + CancellationTokenSource linkedCts = CancellationTokenSource.CreateLinkedTokenSource( + customCts.Token, + CancellationContext.Instance.Cts.Token); + await RunTask(soloTask, linkedCts.Token); + } + /// /// 运行独立任务 @@ -90,10 +99,10 @@ public class Dispatcher /// - AutoFight: 启动自动战斗任务 /// - AutoDomain: 启动自动秘境任务 /// - /// 自定义取消令牌源,允许从JS控制任务取消 + /// 自定义取消令牌,允许从JS控制任务取消 /// /// - public async Task RunTask(SoloTask soloTask, CancellationTokenSource? customCts = null) + public async Task RunTask(SoloTask soloTask, CancellationToken? customCt = null) { if (soloTask == null) { @@ -106,69 +115,56 @@ public class Dispatcher throw new ArgumentNullException(nameof(taskSettingsPageViewModel), "内部视图模型对象为空"); } - // 创建一个链接的取消令牌源,同时监听自定义令牌和全局令牌 - CancellationTokenSource? linkedCts = null; + CancellationToken cancellationToken; - if (customCts != null) + if (customCt != null) { - // 创建链接的取消令牌源,任何一个取消都会触发 - linkedCts = CancellationTokenSource.CreateLinkedTokenSource( - customCts.Token, - CancellationContext.Instance.Cts.Token); - cancellationToken = linkedCts.Token; + cancellationToken = customCt.Value; } else { // 如果没有自定义令牌,就使用全局令牌 cancellationToken = CancellationContext.Instance.Cts.Token; } - - try + + // 根据名称执行任务 + switch (soloTask.Name) { - // 根据名称执行任务 - switch (soloTask.Name) - { - case "AutoGeniusInvokation": - if (taskSettingsPageViewModel.GetTcgStrategy(out var content)) - { - return; - } + case "AutoGeniusInvokation": + if (taskSettingsPageViewModel.GetTcgStrategy(out var content)) + { + return; + } - await new AutoGeniusInvokationTask(new GeniusInvokationTaskParam(content)).Start(cancellationToken); - break; + await new AutoGeniusInvokationTask(new GeniusInvokationTaskParam(content)).Start(cancellationToken); + break; - case "AutoWood": - await new AutoWoodTask(new WoodTaskParam(taskSettingsPageViewModel.AutoWoodRoundNum, - taskSettingsPageViewModel.AutoWoodDailyMaxCount)).Start(cancellationToken); - break; + case "AutoWood": + await new AutoWoodTask(new WoodTaskParam(taskSettingsPageViewModel.AutoWoodRoundNum, + taskSettingsPageViewModel.AutoWoodDailyMaxCount)).Start(cancellationToken); + break; - case "AutoFight": - await new AutoFightHandler().RunAsyncByScript(cancellationToken, null, _config); - break; + case "AutoFight": + await new AutoFightHandler().RunAsyncByScript(cancellationToken, null, _config); + break; - case "AutoDomain": - if (taskSettingsPageViewModel.GetFightStrategy(out var path)) - { - return; - } + case "AutoDomain": + if (taskSettingsPageViewModel.GetFightStrategy(out var path)) + { + return; + } - await new AutoDomainTask(new AutoDomainParam(0, path)).Start(cancellationToken); - break; + await new AutoDomainTask(new AutoDomainParam(0, path)).Start(cancellationToken); + break; - case "AutoFishing": - await new AutoFishingTask(AutoFishingTaskParam.BuildFromSoloTaskConfig(soloTask.Config)).Start( - cancellationToken); - break; + case "AutoFishing": + await new AutoFishingTask(AutoFishingTaskParam.BuildFromSoloTaskConfig(soloTask.Config)).Start( + cancellationToken); + break; - default: - throw new ArgumentException($"未知的任务名称: {soloTask.Name}", nameof(soloTask.Name)); - } - } - finally - { - // 释放链接的取消令牌源 - linkedCts?.Dispose(); + default: + throw new ArgumentException($"未知的任务名称: {soloTask.Name}", nameof(soloTask.Name)); } } @@ -177,10 +173,10 @@ public class Dispatcher // 创建一个新的链接令牌源,链接到全局令牌 return CancellationTokenSource.CreateLinkedTokenSource(CancellationContext.Instance.Cts.Token); } - - + + public CancellationToken GetLinkedCancellationToken() { return GetLinkedCancellationTokenSource().Token; } -} +} \ No newline at end of file