异步函数中使用ValueTuple无法获取返回值问题求助
解决异步函数返回ValueTuple的捕获问题
核心问题
你调用异步函数CleanSunAndMoonJson时,直接赋值得到的是Task<(string, string, string, string)>对象,而非元组本身——异步函数的返回值本质是包装了结果的Task实例,所以直接打印会输出Task的类型信息。
解决方案
在调用异步函数时添加await关键字,等待Task完成并提取内部的元组值,同时确保调用该代码的方法也标记为async:
修改后的调用代码
// 确保当前方法是async修饰的异步方法 var _moonAndSunResult = await CleanSunAndMoonJson(_moonJson); print(_moonAndSunResult);
可选优化:给元组命名提升可读性
为了避免用Item1/Item2这类不直观的方式访问元组成员,建议给函数返回的ValueTuple命名:
修改异步函数定义
async Task<(string Sunrise, string Sunset, string Moonrise, string Moonset)> CleanSunAndMoonJson(string _json) { print("sunRise: " + GetCorrectTimeFormat("sunRise", _json)); print("sunSet: " + GetCorrectTimeFormat("sunSet", _json)); print("moonRise: " + GetCorrectTimeFormat("moonRise", _json)); print("moonSet: " + GetCorrectTimeFormat("moonSet", _json)); Utility.sunrise = GetCorrectTimeFormat("sunRise", _json); Utility.sunset = GetCorrectTimeFormat("sunSet", _json); Utility.moonrise = GetCorrectTimeFormat("moonRise", _json); Utility.moonset = GetCorrectTimeFormat("moonSet", _json); await Task.Yield(); return (Sunrise: Utility.sunrise, Sunset: Utility.sunset, Moonrise: Utility.moonrise, Moonset: Utility.moonset); }
调用时的访问方式
var result = await CleanSunAndMoonJson(_moonJson); print($"日出: {result.Sunrise}, 日落: {result.Sunset}"); print($"月出: {result.Moonrise}, 月落: {result.Moonset}");
特殊场景处理(如Main方法)
如果在程序入口Main方法中调用,C# 7.1及以上版本支持异步Main:
static async Task Main(string[] args) { var _moonJson = "你的JSON字符串"; var result = await CleanSunAndMoonJson(_moonJson); print(result); }
若无法使用异步Main,可临时用.Result获取结果(注意:在UI或ASP.NET环境中可能引发死锁,仅推荐在控制台程序中使用):
var result = CleanSunAndMoonJson(_moonJson).Result; print(result);
内容的提问来源于stack exchange,提问作者PeterK
相关产品推荐
相关产品推荐

