如何简化重复逻辑的异步方法?尝试Action参数遇阻求助
简化重复异步方法的解决方案
你的问题核心是异步委托选择错误——之前尝试用Action<bool, int>但它是同步委托,无法适配异步操作;同时不同方法的参数数量有差异,需要统一封装通用参数。
步骤1:提取通用异步操作方法
把重复的逻辑(会议存在判断、加载状态控制、数据刷新)抽成通用方法,接受一个异步委托执行差异化的核心操作:
private async Task ExecuteVoteOperation(bool args, int voteId, Func<bool, int, int, int, bool?, Task> operation) { if (GeneralMeetingState.GeneralMeeting == null) return; // 提前准备所有通用参数 var meetingId = GeneralMeetingState.GeneralMeeting.ID; var agendaItemId = AgendaItemId; var isUserOwner = GeneralMeetingState.IsUserOwner; _spinnerVisible = true; try { // 执行差异化核心操作 await operation(args, voteId, meetingId, agendaItemId, isUserOwner); // 统一执行数据刷新 await AgendaState.GetAgendaItem(meetingId, agendaItemId); await AgendaItemsDetailState.GetVotesList(meetingId, agendaItemId); } finally { // 确保无论是否异常,加载状态都会关闭 _spinnerVisible = false; } }
步骤2:简化原有四个方法
通过Lambda表达式将每个方法的差异化逻辑传入通用方法,大幅精简代码:
private async Task ChangePresence(bool args, int voteId) { await ExecuteVoteOperation(args, voteId, async (a, v, m, ai, _) => await AgendaItemsDetailState.ChangePresence(a, m, ai, v)); } private async Task VoteFor(bool args, int voteId) { await ExecuteVoteOperation(args, voteId, async (a, v, m, ai, o) => await AgendaItemsDetailState.ChangeVoteFor(a, m, ai, v, o.Value)); } private async Task VoteAgainst(bool args, int voteId) { await ExecuteVoteOperation(args, voteId, async (a, v, m, ai, o) => await AgendaItemsDetailState.ChangeVoteAgainst(a, m, ai, v, o.Value)); } private async Task ChangeVoteAbstinence(bool args, int voteId) { await ExecuteVoteOperation(args, voteId, async (a, v, m, ai, o) => await AgendaItemsDetailState.ChangeVoteAbstinence(a, m, ai, v, o.Value)); }
关键说明
- 异步委托选型:用
Func<..., Task>替代Action<...>,前者支持异步方法的Task返回值,适配你的异步操作需求。 - 参数统一处理:通用方法提前准备好所有可能用到的参数,传入的Lambda可选择性使用(比如
ChangePresence不需要所有者参数,用_忽略即可)。 - 异常安全:添加
try-finally块确保加载状态在任何情况下都会关闭,避免出现加载指示器一直显示的问题。
内容的提问来源于stack exchange,提问作者Koen De Groot
相关产品推荐
相关产品推荐

