2016-04-07 11 views
2

Oluşturduğum bir API'dan bir kimlik doğrulama belirtecini döndürmesi gereken bu kodu kullanıyorum. Benim sayfa görünümünde, SonraC# Web isteğinden sonra Task <string> dizesinden nasıl dize alabilirim?

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 
    } 

: Ben bir asenkron yaklaşım için gitti ama şimdi dize jetonu almak üzere benim belirli durumda ne yapacağını emin değilim, değil Görev, İşte benim kodudur bunu yapar bir olay işleyicisi var:

loginButton.Clicked += (object sender, EventArgs e) => { 
      Authentication a = new Authentication(); 
      string tok = a.StoreTokenFromLogin(usernameInput.Text, passwordInput.Text); 

      authLabel.Text = tok; 

     }; 

Ancak, düğme, uygulama donuyor tıkladığınızda. (Ben Xamarin.Forms'deyim).

+0

Jeton türü nedir? Sizin yönteminiz bir Görev 've Görev . Sonuç '' string' döndürmelidir. – Sven

+0

Sadece AuthLogin() yönteminin sonucunu almaya çalıştım. Yanlış olabilirim, çünkü kendimi çok fazla karıştırdım. – alexcons

+0

Evet, Görev . Sonuç, "dizgiyi" almanın doğru yoludur. Ne ** tam olarak ** geri dönüyor? – Sven

cevap

4
akım iplik (muhtemelen UI iş parçacığı) meşgul etmeden jetonu almak üzere çağrı bekliyor olacak bu

loginButton.Clicked += async(object sender, EventArgs e) => 
{ 
    Authentication a = new Authentication(); 
    string tok = await a.StoreTokenFromLogin(usernameInput.Text, passwordInput.Text); 
    authLabel.Text = tok; 
}; 

için olay işleyicisi değiştirin

.

Ve bunun için StoreTokenFromLogin.

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 
} 

Temelde fikir sizin yöntemle kadar kabarcık oluyor async ve await kullanmaya başladığınızda Bu durumda olduğunu (async void) bir ateş yapmak ve unutmalıyız şey, gelinceye kadar çağırır aşağıdadır olay işleyicisi.

Task.Result kullanırsanız, async - await - - noktasını kullanarak mevcut iş parçacığını engellersiniz.

İlgili konular