2014-10-09 94 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