fix: 移除冗余的取消令牌传递并集中管理取消令牌

在任务执行时,不再从调用方传递 CancellationContext 的令牌,而是在 GearTaskExecutor 内部统一创建和管理链接的取消令牌。这简化了调用方的代码,并确保了取消令牌的正确生命周期管理。
This commit is contained in:
辉鸭蛋
2026-05-09 04:07:15 +08:00
parent 41f38d9e7a
commit 0f9bd7f465
3 changed files with 10 additions and 7 deletions

View File

@@ -1,8 +1,6 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using BetterGenshinImpact.Core.Script;
using BetterGenshinImpact.GameTask;
using BetterGenshinImpact.Service;
using BetterGenshinImpact.Service.GearTask;
@@ -55,8 +53,7 @@ public class QuartzGearTaskJob : IJob
}
var executor = App.GetRequiredService<GearTaskExecutor>();
using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(context.CancellationToken, CancellationContext.Instance.GetActiveToken());
await executor.ExecuteTaskDefinitionAsync(taskDefinitionName, linkedCts.Token);
await executor.ExecuteTaskDefinitionAsync(taskDefinitionName, context.CancellationToken);
_logger.LogInformation("触发器 {TriggerName} 的任务定义执行完成", triggerName);
}

View File

@@ -3,6 +3,8 @@ using System.Collections.Generic;
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;
using BetterGenshinImpact.Core.Script;
using BetterGenshinImpact.GameTask;
using BetterGenshinImpact.Model.Gear;
using BetterGenshinImpact.Model.Gear.Tasks;
using BetterGenshinImpact.Service.GearTask;
@@ -92,7 +94,9 @@ public partial class GearTaskExecutor : ObservableObject
var rootTask = await _taskConverter.ConvertTaskDataAsync(rootTaskData);
// 使用执行管理器执行任务
await _executionManager.ExecuteWithTrackingAsync(rootTask, ct);
CancellationContext.Instance.Set();
using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(ct, CancellationContext.Instance.GetActiveToken());
await _executionManager.ExecuteWithTrackingAsync(rootTask, linkedCts.Token);
StatusMessage = "任务执行完成";
Progress = 100;
@@ -112,6 +116,8 @@ public partial class GearTaskExecutor : ObservableObject
}
finally
{
CancellationContext.Instance.Clear();
RunnerContext.Instance.Clear();
IsExecuting = false;
}
}
@@ -233,4 +239,4 @@ internal class EmptyGearTask : BaseGearTask
{
return Task.CompletedTask;
}
}
}

View File

@@ -350,7 +350,7 @@ public partial class GearTaskListPageViewModel : ViewModel
return;
}
await executor.ExecuteTaskDefinitionAsync(taskDefinition.Name, CancellationContext.Instance.GetActiveToken());
await executor.ExecuteTaskDefinitionAsync(taskDefinition.Name);
}
catch (Exception ex)
{