C# C如何在web请求后从任务中获取字符串?
我有这段代码,它应该从我构建的API返回身份验证令牌。我采用了异步方法,但现在我不确定在我的特定情况下如何获取字符串标记,而不是任务,以下是我的代码:C# C如何在web请求后从任务中获取字符串?,c#,C#,我有这段代码,它应该从我构建的API返回身份验证令牌。我采用了异步方法,但现在我不确定在我的特定情况下如何获取字符串标记,而不是任务,以下是我的代码: private async Task<string> AuthLogin(string user, string pass) { string username = user; string password = pass; string url = "http://lo
private async Task<string> AuthLogin(string user, string pass)
{
string username = user;
string password = pass;
string url = "http://localhost:8000/login";
try {
//retrieve auth token from /login
var client = new HttpClient ();
client.BaseAddress = new Uri(url);
string jsonData = "{\"username\":" + "\"" + username + "\",\"password\":" + "\"" + password + "\"}";
var content = new StringContent (jsonData, Encoding.UTF8, "application/type");
HttpResponseMessage resp = await client.PostAsync (new Uri (url), content);
string s = await resp.Content.ReadAsStringAsync ();
string result = Convert.ToString (s);
//some formatting to extract the actual token string
string[] tokenParts = result.Split (':');
string token = tokenParts[1].Replace ("\"", "");
return token;
}
catch (WebException) {
//error handling here
return null;
}
}
public string StoreTokenFromLogin(string user, string pass)
{
var token = AuthLogin (user, pass).Result;
System.Diagnostics.Debug.WriteLine(token);
System.Diagnostics.Debug.WriteLine(token.GetType ());
return token; //should be a string
}
但是,当我单击按钮时,应用程序冻结。我在Xamarin.Forms中。将事件处理程序更改为
loginButton.Clicked += async(object sender, EventArgs e) =>
{
Authentication a = new Authentication();
string tok = await a.StoreTokenFromLogin(usernameInput.Text, passwordInput.Text);
authLabel.Text = tok;
};
这将等待调用以获取令牌,而不占用当前线程(可能是UI线程)
和您的StoreToken从登录到此
基本上,这个想法是,当您开始使用async并等待它时,它将通过您的方法调用冒泡出来,直到您找到应该执行激发并忘记async void的操作为止,在本例中,async void是您的事件处理程序
如果您确实使用了Task.Result,那么您在等待时阻塞了当前线程,从而无法使用async-await。什么类型的令牌?您的方法返回一个任务和任务。Result应该返回字符串。我刚刚尝试获取AuthLogin的结果,它应该给我一个字符串,但没有。但我可能错了,因为我最终把自己弄糊涂了。是的,任务。结果是获取字符串的正确方法。它究竟返回什么?有什么原因不想等待AuthLogin?如果要异步,则需要等待任务以获得结果。当然,这意味着带有await的方法必须是异步的,它的调用者需要等待,并且它应该冒泡到一个点,如果您想触发忘记,通常在事件处理程序中,这将是一个异步void方法,这是您应该使用该方法而不是异步任务的少数几次之一。
loginButton.Clicked += async(object sender, EventArgs e) =>
{
Authentication a = new Authentication();
string tok = await a.StoreTokenFromLogin(usernameInput.Text, passwordInput.Text);
authLabel.Text = tok;
};
public async Task<string> StoreTokenFromLogin(string user, string pass)
{
var token = await AuthLogin (user, pass);
System.Diagnostics.Debug.WriteLine(token);
System.Diagnostics.Debug.WriteLine(token.GetType ());
return token; //should be a string
}