如何实现带5秒输入超时限制的C#矩阵创建函数
带超时的控制台矩阵生成函数实现
原函数通过控制台输入多行整数生成矩阵,循环逻辑为输入行的列数与第一行相同时持续输入。现在需要修改为:当控制台超过5秒未输入内容时,终止循环并返回已创建的矩阵。
修改后的完整代码
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; public static class MatrixHelper { public static async Task<List<List<int>>> CreateMatrixWithTimeout() { List<List<int>> matrix = new List<List<int>>(); const int timeoutMilliseconds = 5000; // 5秒超时阈值 while (true) { // 同时监听输入完成事件与超时事件 var inputTask = Console.In.ReadLineAsync(); var timeoutTask = Task.Delay(timeoutMilliseconds); var completedTask = await Task.WhenAny(inputTask, timeoutTask); if (completedTask == timeoutTask) { // 触发超时,终止循环 break; } string inputLine = await inputTask; if (string.IsNullOrWhiteSpace(inputLine)) { // 空输入直接终止(可根据需求调整逻辑) break; } // 解析输入行的整数列表 List<int> row = Array.ConvertAll( inputLine.Split(" ", StringSplitOptions.RemoveEmptyEntries), s => int.TryParse(s, out int num) ? num : 0 // 简单处理无效输入,可按需修改 ).ToList(); matrix.Add(row); // 第一行输入完成后,校验后续行列数是否与第一行一致 if (matrix.Count > 1 && matrix[0].Count != row.Count) { break; } } return matrix; } // 同步调用包装方法(适配原有同步调用场景) public static List<List<int>> CreateMatrixWithTimeoutSync() { return CreateMatrixWithTimeout().GetAwaiter().GetResult(); } }
核心改动说明
- 超时逻辑实现:通过
Task.WhenAny同时等待异步输入任务和5秒延迟任务,优先响应先完成的事件,超时直接终止循环。 - 异步输入适配:替换阻塞式的
Console.ReadLine()为异步的Console.In.ReadLineAsync(),确保超时判断不会被输入阻塞。 - 原有逻辑保留:维持了"后续行列数需与第一行一致才继续输入"的校验规则,仅新增超时终止的退出条件。
- 输入容错处理:添加了无效输入的简单兼容(无法解析的字符串转为0),可根据实际需求改为抛出异常或跳过该行。
使用示例
// 异步调用方式 var matrix = await MatrixHelper.CreateMatrixWithTimeout(); // 同步调用方式(适配原有代码调用习惯) var matrixSync = MatrixHelper.CreateMatrixWithTimeoutSync();
内容的提问来源于stack exchange,提问作者Dominik
相关产品推荐
相关产品推荐

