gpt4 book ai didi

c# - 如何获取异步 Task 方法 name() 的返回值?

转载 作者:太空狗 更新时间:2023-10-29 17:39:07 33 4
gpt4 key购买 nike

我正在尝试获取我的方法的返回字符串,但问题是我不知道如何从 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;
}

最佳答案

目前您只是在调用 Wait() - 它将阻塞直到任务完成,但不会为您提供返回值。如果您改为使用 Result 属性,那将阻塞并为您提供结果:

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

现在,这将在 console 应用程序中工作,因为没有 SynchronizationContext... 这意味着异步方法中的延续将在线程池线程上执行。如果您使用来自 WinForms UI 线程的相同代码(例如),那么您最终会遇到死锁 - UI 线程将等待任务完成,但任务在进入 UI 之前无法完成线程执行更多代码。

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

关于c# - 如何获取异步 Task<string> 方法 name() 的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26269066/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com