我在Internet上研究过Task Async方法,但似乎找不到将Task Async中的返回值分配给另一个对象的方法。第一种方法是准备HTTP请求头和Uri。
public static async Task MainAsync()
{
string token = await AuthHelper.AcquireToken(tenantId, clientId, clientSecret);
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
client.BaseAddress = new Uri("https://foo.net");
await GetValue(client);
}
}
第二种方法是使用GetAsync调用API来获取JSON,最后两行我只提取" 值" JSON正文中的字段。
public static async Task<String> GetValue(HttpClient client)
{
string url = $"/mykey/key01";
using (var httpResponse = await client.GetAsync(url))
{
httpResponse.EnsureSuccessStatusCode();
string responsContent = await httpResponse.Content.ReadAsStringAsync();
JObject json = JObject.Parse(responsContent);
string value = json["value"].ToString();
return value;
}
}
现在我想使用此值来分配给另一个对象,但不知道如何这样做。我设法返回有效值。是否可以从另一个方法甚至不同的类中检索值?
[更新]主要功能是:
static void Main(string[] args)
{
try
{
MainAsync().Wait();
}
catch (Exception e)
{
Console.WriteLine(e.GetBaseException().Message);
}
}
&#13;
更新
更清楚。 HTTP响应消息是JSON格式,我可以从此JSON中的Value属性返回值。现在我如何重用外部方法或类
中的值答案 0 :(得分:1)
我不确定你想要实现的目标。关于你的架构会有彻底的争论,你可以做这样的事情......
更新
因为MainAsync
是static
,所以可以在任何地方调用它。
您只需稍微修改一下即可返回结果,如下所示:
public static async Task<string> MainAsync()
{
...
return await GetValue(client);
...
以及其他地方
public class MyAwesomeClass
{
public async Task DoMagic()
{
var newValueOfSomething = await MainAsync();
// hilarity ensues
}
}
答案 1 :(得分:0)
你可以使它更通用和有用,如下所示:
您的初始方法可以更改为:
public async Task<T> GetContentAsync<T>(HttpClient client)
{
string url = $"/mykey/key01";
using (var httpResponse = await client.GetAsync(url))
{
httpResponse.EnsureSuccessStatusCode();
string responsContent = await httpResponse.Content.ReadAsStringAsync();
return Deserialize<T>(json);
}
}
private T Deserialize<T>(string json)
{
return JsonConvert.DeserializeObject<T>(json, SerializationSettings);
}
您现在可以调用以下方法:
var person = await GetContentAsync<Person>(/*http client*/)