c# - 如何从任务中获取价值
问题描述
需要从 System.Threadding.Tasks.Task 中提取值,因为当我调用一个方法时,它返回一个 Task 作为返回值。
我正在使用任务来查找内部的任何属性以获取值,但我没有找到获取值的属性。
目标方法如下所示。
public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
{
object response = null;
ResponseCollection<Model> data = (ResponseCollection<Model>)context.Object;
if (data != null && data.Records != null)
{
List<Response> Response = Mapper.Map<List<Model>, List<Response>>(data.Records);
response = Response;
}
DefaultContractResolver contractResolver = new DefaultContractResolver
{
NamingStrategy = new CamelCaseNamingStrategy()
};
return context.HttpContext.Response
.WriteAsync(JsonConvert.SerializeObject(response,
new JsonSerializerSettings
{
ContractResolver = contractResolver,
Formatting = Formatting.Indented
}), selectedEncoding);
}
我尝试以以下方式调用该方法,但得到的只是任务,但我需要从任务中获取响应。
[TestMethod]
public void SuccessTest()
{
MyFormatter formatter = new MyFormatter();
var httpContext = new DefaultHttpContext();
httpContext.Request.Headers.Add("customheader1", "9");
httpContext.Request.Headers.Add("customheader2", "10");
Func<Stream, Encoding, TextWriter> func = NewMethod;
OutputFormatterWriteContext context = new OutputFormatterWriteContext(httpContext, func, null, GetModel());
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Model, Response>();
});
formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode).Wait();
string responseBody = new StreamReader(context.HttpContext.Response.Body).ReadToEnd();
Assert.AreEqual(1, 1);
}
private TextWriter NewMethod(Stream arg1, Encoding arg2)
{
return new StreamWriter(arg1, arg2);
}
现在,如何从 Task 类型的结果中找到响应?
这是值得注意的,但要构建一个自定义媒体格式化程序和单元测试。我构建了格式化程序,但是在单元测试时我需要响应对象,因为我需要断言。我无法返回任务,因为您可以看到 WriteAsync 方法的返回类型是任务,我必须返回它。
解决方案
你必须有await
async
方法。Task
是结果的包装器,它可选地解析为一个值并保留线程的上下文以捕获异常。
await formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode);
但是,在您的代码中,您只返回一个Task
. 没有实际的返回值,所以你不应该期望从函数中得到任何东西,除了它本身的完成。如果需要从async
函数返回特定值,则应将类型包装在Task
ieTask<T>
中。
推荐阅读
- informix - 如何执行informix编写的ac函数?
- selenium - 如何使用 xpath selenium 查找元素
- javascript - 使用 Angular、ExpressJS、NodeJS 下载带有按钮的文本文档
- android-databinding - 为什么我们应该在变量中写List和DetailedUser
- javascript - Vue JS 三元表达式
- image - 寻找标记为对象检测的图像集?
- javascript - 在反应中,我该如何做一个 if 语句
- c++ - For 循环 (C++)
- angular - Angular:刷新时 - 未找到资源(自动更改请求 URL)
- node.js - 如何使用邮递员在nodejs中测试快速会话类型会话?