如何获取异步的返回值Task methdoName()?
我正在尝试获取我的方法的返回字符串,但问题是我不知道如何从public async Task Login(string username, string password, string site)
获取返回值public async Task 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 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(); SabaCertificate = saba.Certificate; } } return SabaCertificate; }
目前你只是调用Wait()
– 它将阻塞直到任务完成,但不会给你返回值。 如果您使用Result
属性,那将阻止然后给您结果:
string certificate = saba.Login(username, password, site).Result;
现在,这将在控制台应用程序中工作,因为没有SynchronizationContext
…这意味着异步方法中的延续将在线程池线程上执行。 如果您使用WinForms UI线程中的相同代码(例如),那么您最终会遇到死锁 – UI线程将等待任务完成,但在进入UI之前,任务无法完成线程执行更多代码。
SabaCertificate
,这似乎是在SabaModel
中存储SabaCertificate
和SabaController
,但是它应该这样做并不明显。
- 如何正确提供的数据?
- 无法从asp.net Web表单访问网络共享
- 表单身份validation添加其他信息以及ReturnUrl
- 用于处理外部数据的.NET CMS选择
- SqlDependency.Start(connectionString)每次返回false
- InvalidOperationException:无法为“Role”创建DbSet,因为此类型未包含在上下文的模型中
- MusicStore’System.Data.Objects.ObjectSet ‘不包含’Add’的定义,也没有扩展方法’Add’接受第一个参数
- 从服务器端c#代码在客户端系统上运行.exe
- 如何在ASP.NET MVC 3中为填充的下拉列表创建视图模型