我正在执行一个 HttpRequest。事实证明,当我返回响应并显示它可以处理它时,它显示了这个:
System.Threading.Tasks.Task`1[System.String]
我的代码是:
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MLWPF.HttpRequest
{
class Client
{
private static readonly HttpClient httpClient = new HttpClient();
private FormUrlEncodedContent content;
public int Id { get; set; }
public int Uid { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public double Phone { get; set; }
public Client()
{
}
public Client(int id, int uid, string name, string address, double phone)
{
Id = id;
Uid = uid;
Name = name;
Address = address;
Phone = phone;
}
public async Task<string> ReadClients(int uid)
{
var values = new Dictionary<string, string>()
{
{"uid", uid.ToString()}
};
content = new FormUrlEncodedContent(values);
HttpResponseMessage response = await httpClient.PostAsync(new UrlHttpRequest().UrlReadClients, content);
string responseString = await response.Content.ReadAsStringAsync();
return responseString;
}
}
}
事实证明,如果我在返回之前在控制台responseString
中显示,则获得的信息显示正确。
我从连接到按钮的 MainWindow.xaml.cs 中的方法调用它。
private void FAB_Tab1_Button_Click(object sender, RoutedEventArgs e)
{
Client client = new Client();
client.ReadClients(1);
Console.WriteLine(client.Name);
}
我怎样才能在返回时获得所需的信息?
一种选择是使用方法
Task.FromResult<TResult>
,您只需更改return responseString;
为return Task.FromResult<responseString>;
,代码如下:或者在您的情况下,将行从更改
HttpResponseMessag response = ...
为HttpResponseMessage response = await Task.FromResult<string>(httpClient.PostAsync(new UrlHttpRequest().UrlReadClients, content));
OP评论:
确实,这就是问题所在。由于
ReadClients
它是一个方法async
,要获取返回值,您需要使用await
:但是,如果您正在拨打电话
main
,例如,您不能将其标记为async
,那么您必须像这样拨打电话:但应该注意的是,从C# 7.1开始,可以将
main
with标记async
如下:根据您添加到问题的代码进行编辑
如果您尝试从事件处理程序进行调用,则必须添加
async
到事件处理程序的签名并ReadClients
运行await
:...或者,如果您回退到
ReadClients
直接返回所需结果的原始版本(可能是个好主意),则基本相同:我找到了另一种获取信息的方法。为了更容易,我在我分配的类中创建了一个新的字符串变量,
public string s = responseString;
所以当我实例化它时,我以一种新的方式来做。这样我就得到了返回的内容。