如何从任务中获得价值

时间:2019-06-10 09:00:57

标签: c#

需要从System.Threadding.Tasks.Task中提取值,就像当我调用其返回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);
}

现在,如何从任务类型的结果中找到响应?

这是要注意的,但是要构建一个custum媒体格式化程序并对其进行单元测试。我建立了格式化程序,但是当进行单元测试时,我需要像我需要断言的响应对象。 我无法返回任务,因为您可以看到WriteAsync方法的返回类型为Task,我必须将其返回。

2 个答案:

答案 0 :(得分:2)

您必须使用await async个方法。 Task是结果的包装,可以有选择地解析为一个值,并保留线程的上下文以捕获异常。

await formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode);

但是,在您的代码中,您仅返回了Task。没有实际的返回值,因此您不应期望从函数中得到任何回报,除非它本身完成了。如果需要从async函数返回特定值,则应将类型包装在Task中,即Task<T>

答案 1 :(得分:0)

您正在对http上下文执行异步写入操作。等待写操作后,您可以在下一条语句中访问响应

await formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode);

由于您不是在异步方法中执行此操作,因此可以使用Wait()方法来同步等待。

formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode).Wait();

http共振是在写入时被推送到客户端的流。为了读取响应,您必须打开流读取器并读取正文。并且您必须在写入操作完成后执行此操作。

// Read the response body
string responseBody = new StreamReader(context.HttpContext.Response.Body).ReadToEnd();