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;
}
Currently you're just calling
Wait()
- that will block until the task completes, but won't give you the return value. If you use theResult
property instead, that will block and then give you the 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
andSabaModel
in theSabaController
, but it's not obvious that it should be doing that.