How to get returned value of async Task<string> method name()?

纵饮孤独 提交于 2019-12-05 19:51:33

问题


I'm trying to get the return string of my method but the problem is I don't know how can I get the return value from public async Task<string> Login(string username, string password, string site).

This is my codes from 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();
}

This is my codes from Saba 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;
}

回答1:


Currently you're just calling Wait() - that will block until the task completes, but won't give you the return value. If you use the Result property instead, that will block and then give you the result:

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

Now, that will work in a console app because there's no SynchronizationContext... which means continuations in the async method will be executed on a thread pool thread. If you use the same code from a WinForms UI thread (for example) then you'd end up with a deadlock - the UI thread would be waiting for the task to complete, but the task couldn't complete until it got onto the UI thread to execute some more code.

As an aside, this appears to be storing SabaCertificate and SabaModel in the SabaController, but it's not obvious that it should be doing that.



来源:https://stackoverflow.com/questions/26269066/how-to-get-returned-value-of-async-taskstring-method-name

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!