C# 如何获取异步任务的返回值<;字符串>;方法名()?

C# 如何获取异步任务的返回值<;字符串>;方法名()?,c#,async-await,task,console-application,C#,Async Await,Task,Console Application,我正在尝试获取方法的返回字符串,但问题是我不知道如何从公共异步任务登录(字符串用户名、字符串密码、字符串站点)获取返回值 这是我的程序代码 static void Main(string[] args) { var username = "Leonel.Sarmiento"; var password = "welcome"; var site = "QADBSite"; var url = "na1.sabacloud.com"; ConsoleCust

我正在尝试获取方法的返回字符串,但问题是我不知道如何从
公共异步任务登录(字符串用户名、字符串密码、字符串站点)
获取返回值

这是我的程序代码

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();
}
static void Main(字符串[]args)
{
var username=“Leonel.Sarmiento”;
var password=“欢迎”;
var site=“qadsite”;
var url=“na1.sabacloud.com”;
ConsoleCustomizer.Spinner微调器=新的ConsoleCustomizer.Spinner(“+”、“x”、“+”、“x”);
ConsoleCustomizer.TypeWriter打字机=新的ConsoleCustomizer.TypeWriter(15150);
ConsoleCustomizer.Alerts Alerts=新的ConsoleCustomizer.Alerts();
警报。写入(“信息”,“主机URL:”,空);
打字机.WriteLine(@“http:\\”+url);
警报。写入(“信息”,“用户名:”,空);
打字机。WriteLine(用户名);
警报。写入(“信息”,“密码:”,空);
for(var i=0;i
这是我在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;
}
公共异步任务登录(字符串用户名、字符串密码、字符串站点)
{
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(“https://”+HostURL+“/”);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
client.DefaultRequestHeaders.Add(“用户”,用户名);
client.DefaultRequestHeaders.Add(“密码”,password);
client.DefaultRequestHeaders.Add(“site”,site);
//HTTP-GET:saba/api/login
httpresponsemessageresponse=wait client.GetAsync(“Saba/api/login”);
if(响应。IsSuccessStatusCode)
{
SabaModel saba=wait response.Content.ReadAsAsync();
saba证书=saba证书;
}
}
返回SABA证书;
}

当前您只需调用
Wait()
——这将阻止任务完成,但不会给出返回值。如果改为使用
Result
属性,则会阻塞并给出结果:

string certificate = saba.Login(username, password, site).Result;
现在,这将在控制台应用程序中起作用,因为没有同步上下文。。。这意味着异步方法中的continuations将在线程池线程上执行。例如,如果使用来自WinForms UI线程的相同代码,那么最终会出现死锁-UI线程将等待任务完成,但任务无法完成,直到它进入UI线程执行更多代码


另一方面,这似乎是将
SabaCertificate
SabaModel
存储在
SabaController
中,但它是否应该这样做并不明显。

我建议您从代码中删除凭据snippet@LeeGary这是一张假证件:谢谢!最后,我可以完成我的项目了。这对我帮助很大。下次在提问之前,我将探讨一下工具提示。Jon Skeet回答我的问题太酷了,我希望他们对你的个人资料做一个跟踪按钮。