如何基于异步返回的满量列表实现循环重执逻辑?
解决方案
直接调整代码逻辑,通过判断Execute()返回的消息列表长度来决定是否等待。同时注意在异步方法中用await Task.Delay()替代Thread.Sleep(),避免阻塞线程:
public async Task ProcessNewMessages() { while (true) { List<Message> newMessages = null; await _exceptionHandler.WithExceptionHandling(async () => { newMessages = await _newUncompletedMessagesJob.Execute(); // Do stuff 处理消息的逻辑保持不变 }); // 根据返回的消息数量决定是否等待 if (newMessages?.Count < 10) { await Task.Delay(30000); // 不满10条时等待30秒 } // 满10条时直接进入下一次循环,立即重新执行 } }
关键说明:
- 将消息列表变量移到异常处理外层,方便后续判断长度。
- 替换
Thread.Sleep为Task.Delay:在异步方法中,Thread.Sleep会阻塞当前线程,而Task.Delay是异步等待,不会占用线程资源,更符合异步编程的最佳实践。 - 逻辑判断:如果返回的消息数小于10(包括空列表的情况),就等待30秒再继续检查;如果刚好是10条,直接进入下一次循环,立即执行
Execute()拉取新消息。
内容的提问来源于stack exchange,提问作者Sebastiaan Haverkate
相关产品推荐
相关产品推荐

