首页 > 解决方案 > 如何从任务中获取价值

问题描述

需要从 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 方法的返回类型是任务,我必须返回它。

标签: c#

解决方案


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

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

但是,在您的代码中,您只返回一个Task. 没有实际的返回值,所以你不应该期望从函数中得到任何东西,除了它本身的完成。如果需要从async函数返回特定值,则应将类型包装在TaskieTask<T>中。


推荐阅读