c# - 异步方法将响应发送回 Main
问题描述
我已经使用异步方法实现了一个肥皂客户端。我希望此方法将从 API 服务器获得的字符串值返回到我的主线程或另一个方法(无论调用哪个方法)。我该怎么做呢:
主线
static void Main(string[] args)
{
TEXT().GetAwaiter().OnCompleted(() => { Console.WriteLine("finished"); });
Console.ReadKey();
// if I do it like this
// var test = TEXT().GetAwaiter().OnCompleted(() => { Console.WriteLine("finished"); });
// it gives me error: Cannot assign void to an implicitly-typed local variable
}
异步方法
public static async Task<string> TEXT()
{
Uri uri = new Uri("http://myaddress");
HttpClient hc = new HttpClient();
hc.DefaultRequestHeaders.Add("SOAPAction", "Some Action");
var xmlStr = "SoapContent"; //not displayed here for simplicity
var content = new StringContent(xmlStr, Encoding.UTF8, "text/xml");
using (HttpResponseMessage response = await hc.PostAsync(uri, content))
{
var soapResponse = await response.Content.ReadAsStringAsync();
string value = await response.Content.ReadAsStringAsync();
return value; //how do I get this back to the main thread or any other method
}
}
解决方案
如果您打算在控制台应用程序中执行大量异步操作,我建议使用这种 MainAsync 模式:
static public void Main(string[] args) //Entry point
{
MainAsync(args).GetAwaiter().GetResult();
}
static public Task MainAsync(string[] args) //Async entry point
{
await TEXT();
Console.WriteLine("finished");
}
如果升级到 C# 7.1 或更高版本,则可以删除该Main
方法并使用async main。
或者,如果您曾经将此代码迁移到 ASP.NET 或 WinForms 应用程序,您可以忽略Main
并将代码迁移到其中MainAsync
(否则您将与同步模型发生冲突并陷入死锁)。
推荐阅读
- cryptography - 保存使用用户密码加密的私钥是否比在数据库中存储哈希更安全?
- pandas - 根据其他列中的条件替换值
- directx - 为什么每次 OpenSharedResource 调用都会导致显存增加(泄漏)?
- r - 创建 df 时:对于一列,仅在特定行中添加值
- c - 如何使用纯 C 的指针设计函数
- docker - 如何将 rpm 安装到 /usr/bin 而不是 /opt/app-root/bin
- flutter - 如何删除 Cloud Firestore 中除一个之外的所有文档?
- python - 使用科隆语音算法自动进行数据转换
- mysql - 如何在没有左和子字符串的情况下删除字符串中的最后一个符号?
- excel - 如何在 Visual Basic 中获取 Excel 版本?