You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Caliburn.Micro中EventAggregator多消息处理技术咨询(C#/WPF项目)

EventAggregator多消息处理方案(针对维修订单CSV加载场景)

针对你这个用EventAggregator处理多维修订单CSV加载的场景,我整理了几个实用的处理方案,都是WPF/.NET生态里常用的最佳实践:

1. 定义强类型专用事件,携带完整上下文

别用通用的消息类型,而是为CSV加载操作创建专属的事件类,把日程名称、解析后的数据、文件路径等关键信息封装进去。这样订阅者能一眼明确消息内容,完全避免多消息混淆的问题。

示例代码:

// 自定义事件类
public class ScheduleCsvLoadedEvent : PubSubEvent<ScheduleCsvPayload> { }

// 消息负载类,包含所有必要上下文
public class ScheduleCsvPayload
{
    public string ScheduleName { get; set; } // 对应的日程名称
    public IEnumerable<RepairOrderAccountingRecord> AccountingData { get; set; } // 解析后的会计数据
    public string SourceFilePath { get; set; } // 原始CSV文件路径
}

发布消息时直接传递完整负载:

// 解析完CSV后发布
var payload = new ScheduleCsvPayload
{
    ScheduleName = selectedScheduleName,
    AccountingData = parsedRecords,
    SourceFilePath = openFileDialog.FileName
};
_eventAggregator.PublishOnUIThread(payload);

2. 支持批量加载的事件类型

如果用户可能一次性加载多个日程的CSV(比如弹窗里允许选多个文件),可以额外定义一个批量事件,携带多个负载的集合。这样订阅者能一次性处理所有数据,减少频繁消息发布的开销,也方便统一做数据合并、分组展示等操作。

示例:

public class BatchScheduleCsvLoadedEvent : PubSubEvent<List<ScheduleCsvPayload>> { }

// 发布批量消息
_eventAggregator.PublishOnUIThread(listOfAllLoadedPayloads);

3. 订阅端添加消息过滤与分支处理

订阅事件时,可以通过Filter参数精准筛选自己关心的消息,比如某个订阅者只处理特定日程的数据;或者在处理方法里根据日程名称做逻辑分支,把不同日程的数据分发到对应的UI区域(比如不同的Tab页、分组列表)。

示例过滤订阅:

// 只处理"2024年度春季维修"这个日程的数据
_eventAggregator.GetEvent<ScheduleCsvLoadedEvent>()
    .Subscribe(HandleSpringScheduleData, 
               ThreadOption.UIThread, 
               filter: payload => payload.ScheduleName == "2024年度春季维修");

示例分支处理:

private void HandleCsvLoaded(ScheduleCsvPayload payload)
{
    switch(payload.ScheduleName)
    {
        case "2024Q1":
            LoadQ1Data(payload.AccountingData);
            break;
        case "2024Q2":
            LoadQ2Data(payload.AccountingData);
            break;
        default:
            AddToGeneralDataGroup(payload);
            break;
    }
}

4. 补充加载状态相关事件,提升用户体验

除了加载完成的消息,建议添加加载开始、加载失败的事件,让UI能及时反馈状态(比如显示加载动画、错误提示),避免用户困惑。

示例状态事件:

// 加载开始事件
public class ScheduleCsvLoadingStartedEvent : PubSubEvent<string> { } // 参数为日程名称

// 加载失败事件
public class ScheduleCsvLoadFailedEvent : PubSubEvent<(string ScheduleName, Exception Error)> { }

发布状态消息:

// 开始加载时
_eventAggregator.PublishOnUIThread(selectedScheduleName);

// 加载失败时
_eventAggregator.PublishOnUIThread((selectedScheduleName, ex));

5. 注意订阅的生命周期管理,避免内存泄漏

在WPF中,一定要记得在视图模型/视图销毁时取消订阅EventAggregator事件,否则会导致内存泄漏。可以用SubscriptionToken来管理订阅:

private SubscriptionToken _csvLoadedSubscription;

// 订阅时保存token
_csvLoadedSubscription = _eventAggregator.GetEvent<ScheduleCsvLoadedEvent>()
    .Subscribe(HandleCsvLoaded);

// 在ViewModel的Dispose方法或视图的Unloaded事件中取消订阅
public void Dispose()
{
    _csvLoadedSubscription?.Dispose();
}

内容的提问来源于stack exchange,提问作者Dwayne B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:02:30