【发布时间】:2021-11-02 18:23:56
【问题描述】:
我有一个应用程序,其中一个按钮开始创建 XML。在 每个 XML 创建结束时,SendInvoice 函数发送它,接收响应,然后一个函数 (ParseResponse) 解析响应并执行需要数据库操作。
这个想法是,当所有的 XML 被创建和发送后,应用程序必须关闭。 问题是我失去了对异步的控制,并且应用程序似乎在 它实际上完成所有工作之前关闭。此外,在处理之前的 XML 之前发送 XML。
ParseResponse 函数不是异步的。
这里是 SendInvoice 函数。
你能推荐一些好的做法吗?
提前谢谢你。
public async void SendInvoice(string body)
{
Cursor.Current = Cursors.WaitCursor;
var client = new HttpClient();
var queryString = HttpUtility.ParseQueryString(string.Empty);
var uri = "https://xxxx.xxx/SendInvoices?" + queryString;
HttpResponseMessage response;
// Request body
byte[] byteData = Encoding.UTF8.GetBytes(body);
using (var content = new ByteArrayContent(byteData))
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/xml");
response = await client.PostAsync(uri, content);
string responsebody = await response.Content.ReadAsStringAsync();
ParseResponse(response.ToString());
ParseResponse(responsebody);
}
}
剩下的代码
private void button1_Click(object sender, EventArgs e)
{
For
{
......
SendInvoice(xml)
}
System.Windows.Forms.Application.Exit();
}
【问题讨论】:
-
1.
async void除非在事件处理程序中使用,否则应避免使用,将方法签名更改为async Task。 2.您没有发布足够多的代码来确定程序在作业完成之前退出的原因,但我猜这是因为您没有等待作业完成。 IE。 我认为 ParseResponse 的代码和按钮不会提供更多提示。 - 是的。 -
你可以等待所有作业完成,比如WhenAll()。
-
SendInvoice将在完成之前返回。您需要在调用 SendInvoice 的地方使用await,或使 SendInvoice 同步 -
查看此处了解重构代码的方法stackoverflow.com/a/9343733/2030565
-
@PanosPlat 您可以从同步方法调用异步代码(带有警告)。只需将
.Result附加到调用以等待任务完成并给出返回值
标签: c# asynchronous httpclient