C# C如何在web请求后从任务中获取字符串?

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

我有这段代码,它应该从我构建的API返回身份验证令牌。我采用了异步方法,但现在我不确定在我的特定情况下如何获取字符串标记,而不是任务,以下是我的代码:

    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
}