如何获取异步任务方法名()的返回值?

10

我正在尝试获取我的方法的返回字符串,但问题在于我不知道如何从public async Task<string> Login(string username, string password, string site)中获取返回值。

以下是我在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();
}

这是我从 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;
}

我建议你从代码片段中删除你的凭据。 - Lee Gary
1
@LeeGary 这是虚假的凭据 :D - Onel Sarmiento
1个回答

23

目前你只是调用了 Wait() 方法 - 它会阻塞直到任务完成,但不会返回结果。如果使用 Result 属性,它会阻塞并返回结果:

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

现在,在控制台应用程序中可以工作,因为没有SynchronizationContext……这意味着异步方法中的续体将在线程池线程上执行。如果您从WinForms UI线程(例如)使用相同的代码,则会出现死锁-UI线程将等待任务完成,但任务无法完成,直到进入UI线程以执行更多代码。

顺便说一句,这似乎是将SabaCertificateSabaModel存储在SabaController中,但并不明显它应该这样做。


谢谢!终于可以完成我的项目了,这真的帮了我很多,下次在提问之前我会先探索一下工具提示。Jon Skeet回答我的问题非常棒,我希望他们能为您的个人资料添加一个关注按钮。 - Onel Sarmiento

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接