C# 如何从任务中获得价值

C# 如何从任务中获得价值,c#,C#,当我调用方法时,需要从System.Threading.Tasks.Task as中提取值,该方法将任务作为返回值返回 我使用该任务查找其中的任何属性以获取值,但我没有找到任何属性来获取值 目标方法如下所示 public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding) { object response

当我调用方法时,需要从System.Threading.Tasks.Task as中提取值,该方法将任务作为返回值返回

我使用该任务查找其中的任何属性以获取值,但我没有找到任何属性来获取值

目标方法如下所示

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);
        }
public override Task WriteResponseBodyAsync(OutputFormatterWriteContext,Encoding selectedEncoding)
{
对象响应=null;
ResponseCollection数据=(ResponseCollection)context.Object;
if(data!=null&&data.Records!=null)
{
列表响应=Mapper.Map(data.Records);
响应=响应;
}
DefaultContractResolver contractResolver=新的DefaultContractResolver
{
NamingStrategy=新CamelCaseNamingStrategy()
};
返回context.HttpContext.Response
.WriteAsync(JsonConvert.SerializeObject)(响应,
新JsonSerializerSettings
{
ContractResolver=ContractResolver,
格式化=格式化。缩进
}),选择编码);
}
我试着用下面的方式调用这个方法,但是我得到的只是任务,但是我需要从任务中得到响应

[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);
}
[TestMethod]
public void SuccessTest()
{
MyFormatter formatter=新的MyFormatter();
var httpContext=new DefaultHttpContext();
httpContext.Request.Headers.Add(“customheader1”、“9”);
httpContext.Request.Headers.Add(“customheader2”、“10”);
Func Func=NewMethod;
OutputFormatterWriteContext=新的OutputFormatterWriteContext(httpContext,func,null,GetModel());
Mapper.Initialize(cfg=>
{
CreateMap();
});
WriteResponseBodyAsync(context,Encoding.bigendiaUnicode).Wait();
string responseBody=newstreamreader(context.HttpContext.Response.Body).ReadToEnd();
断言.AreEqual(1,1);
}
私有TextWriter NewMethod(流arg1,编码arg2)
{
返回新的StreamWriter(arg1、arg2);
}
现在,如何从Task类型的结果中找到响应

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

您必须等待
异步
方法<代码>任务
是结果的包装器,可以选择解析为值,并保留线程上下文以捕获异常

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

但是,在代码中,只返回一个
任务
。没有实际的返回值,所以除了函数本身的完成之外,您不应该期望从函数中得到任何东西。如果需要从
async
函数返回特定值,则应将类型包装在
任务中,即
任务
必须等待
异步
方法<代码>任务
是结果的包装器,可以选择解析为值,并保留线程上下文以捕获异常

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

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

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

await formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode);
由于不是在异步方法中执行此操作,因此可以使用
Wait()
方法同步等待

formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode).Wait();
http resonse是一个流,它在写入客户端时被推送到客户端。为了读取响应,您必须打开流读取器并读取正文。您必须在写入操作完成后执行此操作

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

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

await formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode);
由于不是在异步方法中执行此操作,因此可以使用
Wait()
方法同步等待

formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode).Wait();
http resonse是一个流,它在写入客户端时被推送到客户端。为了读取响应,您必须打开流读取器并读取正文。您必须在写入操作完成后执行此操作

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

您可以等待它们,但这不是一种异步方法。我们只能对异步方法使用wait,对吗?您的方法不返回任何值。您可能需要一个
任务
。什么是上下文对象?@user3625533“但它不是一个异步方法。”-然后它要么a:不应该询问任务的结果(除非它知道任务现在总是完全完成),要么b:它需要成为一个异步方法您
等待
任务,但它不是一个异步方法。我们只能对异步方法使用wait,对吗?您的方法不返回任何值。您可能需要一个
任务
。什么是上下文对象?@user3625533“但它不是一个异步方法。”-那么它要么是:不应该询问任务的结果(除非它知道任务到现在为止总是完全完成),或者b:它需要变成异步的method@user3625533您是否尝试了此操作?尝试了此操作,但响应正文显示为空字符串,状态代码显示为200,这意味着应生成响应。这是因为您正在编写一个
null
值<代码>对象响应=null用实际代码更新了我的问题。iam从单元测试用例中注入响应,它必须转换为另一个模型,然后必须在响应对象中被我的格式化程序代码覆盖。但我仍然得到空字符串。@user3625533您尝试过这个吗?