2014-10-09 99 views
3

我想獲得我的方法的返回字符串,但問題是我不知道如何從public async Task<string> Login(string username, string password, string site)得到返回值。如何獲取異步的返回值任務<string> methdoName()?

這是Program.cs的

static void Main(string[] args) 
{ 
    var username = "Leonel.Sarmiento"; 
    var password = "welcome"; 
    var site = "QADBSite"; 
    var url = "na1.sabacloud.com"; 
    ConsoleCustomizer.Spinner Spinner = new ConsoleCustomizer.Spinner("+", "x", "+", "x"); 
    ConsoleCustomizer.TypeWriter TypeWriter = new ConsoleCustomizer.TypeWriter(15, 150); 
    ConsoleCustomizer.Alerts Alerts = new ConsoleCustomizer.Alerts(); 
    Alerts.Write("Information", "HOST URL:", null); 
    TypeWriter.WriteLine(@"http:\\"+url); 
    Alerts.Write("Information", "USERNAME:", null); 
    TypeWriter.WriteLine(username); 
    Alerts.Write("Information", "PASSWORD:", null); 
    for (var i = 0; i < password.Length; i++) 
    { 
     TypeWriter.Write("*"); 
    } 
    Console.WriteLine(""); 
    SabaController saba = new SabaController(url); 
    //var certificate = saba.Login(username, password, site).Wait(); 
    saba.Login(username, password, site).Wait(); 
    Console.Read(); 
} 

我的代碼這是薩巴Controller.cs我的代碼

public async Task<string> Login(string username, string password, string site) 
{ 
    using(var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri("https://" + HostURL + "/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     client.DefaultRequestHeaders.Add("user", username); 
     client.DefaultRequestHeaders.Add("password", password); 
     client.DefaultRequestHeaders.Add("site", site); 
     //HTTP GET: saba/api/login 
     HttpResponseMessage response = await client.GetAsync("Saba/api/login"); 
     if (response.IsSuccessStatusCode) 
     { 
      SabaModel saba = await response.Content.ReadAsAsync<SabaModel>(); 
      SabaCertificate = saba.Certificate; 
     } 
    } 
    return SabaCertificate; 
} 
+0

我建議你從代碼片段中刪除你的憑證 – 2014-10-09 01:59:41

+1

@LeeGary這是一個虛假憑證:D – 2014-10-09 02:10:00

回答

9

目前你只是調用Wait() - 將阻塞,直到任務完成,但不會給你返回值。如果您使用Result屬性來代替,這將阻止,然後給你的結果:

string certificate = saba.Login(username, password, site).Result; 

現在,這將在控制檯應用工作,因爲沒有SynchronizationContext ...這意味着在異步方法延續將在線程池線程上執行。如果你使用WinForms UI線程中的相同代碼(例如),那麼你最終會遇到死鎖 - UI線程將等待任務完成,但是直到進入UI時才能完成任務線程來執行一些更多的代碼。

順便說一句,這似乎是存儲SabaCertificateSabaModelSabaController,但不是很明顯,它應該那麼做。

+0

謝謝!最後,我可以完成我的項目,這對我非常有幫助,下次我會在提問之前探索工具提示。喬恩Skeet回答我的問題這麼酷我希望他們按下你的個人資料。 – 2014-10-09 02:19:37