mirror of
https://github.com/babalae/better-genshin-impact.git
synced 2026-05-21 09:45:48 +08:00
329 lines
7.5 KiB
Markdown
329 lines
7.5 KiB
Markdown
# GearTaskExecutor 使用指南
|
||
|
||
## 概述
|
||
|
||
`GearTaskExecutor` 是一个强大的任务执行控制器,能够从 JSON 文件中解析并执行继承自 `BaseGearTask` 的不同类型任务。这些任务统一使用 `GearTaskData` 对象进行序列化。
|
||
|
||
## 核心组件
|
||
|
||
### 1. GearTaskExecutor
|
||
主要的任务执行控制器,提供以下功能:
|
||
- 从 JSON 文件加载任务定义
|
||
- 执行任务并跟踪进度
|
||
- 异常处理和日志记录
|
||
- 任务状态管理
|
||
|
||
### 2. GearTaskFactory
|
||
任务工厂,根据任务类型创建对应的任务实例:
|
||
- JavaScript 任务
|
||
- Pathing 任务
|
||
- C# 反射任务
|
||
- KeyMouse 任务
|
||
- Shell 任务
|
||
|
||
### 3. GearTaskConverter
|
||
任务转换器,将 `GearTaskData` 转换为可执行的 `BaseGearTask`:
|
||
- 递归处理子任务
|
||
- 参数验证
|
||
- 错误处理
|
||
|
||
### 4. GearTaskExecutionManager
|
||
任务执行管理器,提供详细的执行状态跟踪:
|
||
- 实时进度更新
|
||
- 任务状态监控
|
||
- 执行统计信息
|
||
- 事件通知
|
||
|
||
## 服务注册
|
||
|
||
在 `App.xaml.cs` 中注册服务:
|
||
|
||
```csharp
|
||
// 方式1:使用扩展方法注册所有服务
|
||
services.AddGearTaskServices();
|
||
|
||
// 方式2:带配置选项注册
|
||
services.AddGearTaskServices(options =>
|
||
{
|
||
options.EnableVerboseLogging = true;
|
||
options.ContinueOnTaskFailure = false;
|
||
options.MaxConcurrentTasks = 1;
|
||
});
|
||
|
||
// 方式3:手动注册(如果需要自定义)
|
||
services.AddSingleton<GearTaskStorageService>();
|
||
services.AddSingleton<GearTaskFactory>();
|
||
services.AddSingleton<GearTaskConverter>();
|
||
services.AddTransient<GearTaskExecutionManager>();
|
||
services.AddTransient<GearTaskExecutor>();
|
||
```
|
||
|
||
## 基本使用
|
||
|
||
### 1. 执行任务定义
|
||
|
||
```csharp
|
||
public class TaskExecutionViewModel : ObservableObject
|
||
{
|
||
private readonly GearTaskExecutor _taskExecutor;
|
||
|
||
public TaskExecutionViewModel(GearTaskExecutor taskExecutor)
|
||
{
|
||
_taskExecutor = taskExecutor;
|
||
}
|
||
|
||
[RelayCommand]
|
||
private async Task ExecuteTaskDefinitionAsync(string taskDefinitionName)
|
||
{
|
||
try
|
||
{
|
||
await _taskExecutor.ExecuteTaskDefinitionAsync(taskDefinitionName);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
// 处理异常
|
||
Debug.WriteLine($"任务执行失败: {ex.Message}");
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. 直接执行任务数据
|
||
|
||
```csharp
|
||
[RelayCommand]
|
||
private async Task ExecuteTaskDataAsync()
|
||
{
|
||
var taskData = new GearTaskData
|
||
{
|
||
Name = "测试任务",
|
||
Type = "javascript",
|
||
IsEnabled = true,
|
||
Parameters = new JavascriptGearTaskParams
|
||
{
|
||
FolderName = "test-script",
|
||
Context = new { message = "Hello World" }
|
||
}
|
||
};
|
||
|
||
try
|
||
{
|
||
await _taskExecutor.ExecuteTaskDataAsync(taskData);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
// 处理异常
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3. 监控执行进度
|
||
|
||
```csharp
|
||
public class TaskMonitorViewModel : ObservableObject
|
||
{
|
||
private readonly GearTaskExecutor _taskExecutor;
|
||
|
||
[ObservableProperty]
|
||
private double _progress;
|
||
|
||
[ObservableProperty]
|
||
private string _currentTaskName = string.Empty;
|
||
|
||
[ObservableProperty]
|
||
private string _statusMessage = string.Empty;
|
||
|
||
public TaskMonitorViewModel(GearTaskExecutor taskExecutor)
|
||
{
|
||
_taskExecutor = taskExecutor;
|
||
|
||
// 绑定属性
|
||
_taskExecutor.PropertyChanged += OnTaskExecutorPropertyChanged;
|
||
}
|
||
|
||
private void OnTaskExecutorPropertyChanged(object? sender, PropertyChangedEventArgs e)
|
||
{
|
||
switch (e.PropertyName)
|
||
{
|
||
case nameof(GearTaskExecutor.Progress):
|
||
Progress = _taskExecutor.Progress;
|
||
break;
|
||
case nameof(GearTaskExecutor.CurrentTaskName):
|
||
CurrentTaskName = _taskExecutor.CurrentTaskName;
|
||
break;
|
||
case nameof(GearTaskExecutor.StatusMessage):
|
||
StatusMessage = _taskExecutor.StatusMessage;
|
||
break;
|
||
}
|
||
}
|
||
|
||
[RelayCommand]
|
||
private void StopExecution()
|
||
{
|
||
_taskExecutor.StopExecution();
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4. 获取执行统计信息
|
||
|
||
```csharp
|
||
[RelayCommand]
|
||
private void ShowStatistics()
|
||
{
|
||
var stats = _taskExecutor.GetExecutionStatistics();
|
||
|
||
var message = $@"执行统计信息:
|
||
总任务数: {stats.TotalTasks}
|
||
已完成: {stats.CompletedTasks}
|
||
失败: {stats.FailedTasks}
|
||
跳过: {stats.SkippedTasks}
|
||
成功率: {stats.SuccessRate:F1}%
|
||
整体进度: {stats.OverallProgress:F1}%";
|
||
|
||
MessageBox.Show(message);
|
||
}
|
||
```
|
||
|
||
## 支持的任务类型
|
||
|
||
### 1. JavaScript 任务
|
||
```json
|
||
{
|
||
"name": "JavaScript 脚本任务",
|
||
"type": "javascript",
|
||
"isEnabled": true,
|
||
"parameters": {
|
||
"folderName": "my-script",
|
||
"context": {
|
||
"param1": "value1",
|
||
"param2": 123
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. Pathing 任务
|
||
```json
|
||
{
|
||
"name": "路径任务",
|
||
"type": "pathing",
|
||
"isEnabled": true,
|
||
"parameters": {
|
||
"path": "path/to/route.json",
|
||
"pathingPartyConfig": {
|
||
"team": ["character1", "character2"]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3. C# 反射任务
|
||
```json
|
||
{
|
||
"name": "C# 反射任务",
|
||
"type": "csharp",
|
||
"isEnabled": true,
|
||
"parameters": {
|
||
"methodPath": "MyNamespace.MyClass.MyMethod",
|
||
"parametersJson": "[\"param1\", 123, {\"key\": \"value\"}]"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4. KeyMouse 任务
|
||
```json
|
||
{
|
||
"name": "键鼠录制任务",
|
||
"type": "keymouse",
|
||
"isEnabled": true,
|
||
"parameters": "path/to/macro.json"
|
||
}
|
||
```
|
||
|
||
### 5. Shell 任务
|
||
```json
|
||
{
|
||
"name": "Shell 命令任务",
|
||
"type": "shell",
|
||
"isEnabled": true,
|
||
"parameters": {
|
||
"command": "echo Hello World",
|
||
"workingDirectory": "C:\\temp",
|
||
"timeout": 30000
|
||
}
|
||
}
|
||
```
|
||
|
||
## 错误处理
|
||
|
||
### 1. 任务验证
|
||
```csharp
|
||
public async Task<bool> ValidateTaskAsync(GearTaskData taskData)
|
||
{
|
||
var converter = serviceProvider.GetRequiredService<GearTaskConverter>();
|
||
var result = converter.ValidateTaskData(taskData);
|
||
|
||
if (!result.IsValid)
|
||
{
|
||
foreach (var error in result.Errors)
|
||
{
|
||
Debug.WriteLine($"验证错误: {error}");
|
||
}
|
||
return false;
|
||
}
|
||
|
||
foreach (var warning in result.Warnings)
|
||
{
|
||
Debug.WriteLine($"验证警告: {warning}");
|
||
}
|
||
|
||
return true;
|
||
}
|
||
```
|
||
|
||
### 2. 异常处理
|
||
```csharp
|
||
try
|
||
{
|
||
await _taskExecutor.ExecuteTaskDefinitionAsync(taskName);
|
||
}
|
||
catch (ArgumentException ex)
|
||
{
|
||
// 参数错误
|
||
MessageBox.Show($"参数错误: {ex.Message}");
|
||
}
|
||
catch (FileNotFoundException ex)
|
||
{
|
||
// 文件未找到
|
||
MessageBox.Show($"文件未找到: {ex.Message}");
|
||
}
|
||
catch (OperationCanceledException)
|
||
{
|
||
// 用户取消
|
||
MessageBox.Show("任务执行已取消");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
// 其他异常
|
||
MessageBox.Show($"执行失败: {ex.Message}");
|
||
}
|
||
```
|
||
|
||
## 最佳实践
|
||
|
||
1. **使用依赖注入**:通过构造函数注入 `GearTaskExecutor`
|
||
2. **异步执行**:所有任务执行都应该使用 `async/await`
|
||
3. **异常处理**:始终包装任务执行在 try-catch 块中
|
||
4. **进度监控**:绑定执行器的属性来显示进度
|
||
5. **资源清理**:在适当的时候取消任务执行
|
||
6. **日志记录**:启用详细日志记录来调试问题
|
||
7. **参数验证**:在执行前验证任务数据的完整性
|
||
|
||
## 注意事项
|
||
|
||
- 任务执行器是线程安全的,但同时只能执行一个任务
|
||
- 子任务会按顺序执行,不支持并行执行
|
||
- 禁用的任务会被跳过,但仍会处理其子任务
|
||
- 任务失败会停止整个执行流程,除非配置为继续执行
|
||
- 所有任务都支持取消操作 |