我是使用异步方法的新手,可以使用一些帮助。 Winforms .Net 4.5程序:ReadInputFile循环遍历csv文件中的每一行,并调用发布到API的异步方法UpdatePOS_Monitor。到目前为止一切正常(我的数据库正在获取新行)但我不知道如何在ReadInputFile完成时退出应用程序,因为它正在调用异步方法。或者,如果使用此设置,ReadInputFile将超越自身?我猜我需要在某个地方'等待',但不知道该怎么办?谢谢。
private void ReadInputFile()
{
var reader = new StreamReader(File.OpenRead(FilePath + @"\" + FileNameAdd));
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split(',');
var Newline = new RevenueLine();
Newline.ClubID = values[0];
Newline.Date = values[1];
Newline.Department = values[2];
Newline.Description = values[3];
Newline.Chits = Convert.ToInt32(values[4]);
Newline.Sales = values[5];
UpdatePOS_Monitor(Newline);
}
}
private async void UpdatePOS_Monitor(RevenueLine line)
{
HttpClient client = new HttpClient();
try
{
string json = JsonConvert.SerializeObject(line);
HttpResponseMessage wcfResponse = await client.PostAsync(API_Address, new StringContent(json, Encoding.UTF8, "application/json"));
}
catch
{
}
}
答案 0 :(得分:2)
如果您正在使用async/await
,则整个方法链必须是async
,一直到根(例如,到UI控件事件处理程序)。在您的情况下,这意味着ReadInputFile
必须是async
,UpdatePOS_Monitor
必须是async Task
而不是async void
:
// root event handler
private async void button_Click(object s, EventArgs e)
{
await ReadInputFile();
}
private async Task ReadInputFile()
{
var reader = new StreamReader(File.OpenRead(FilePath + @"\" + FileNameAdd));
while (!reader.EndOfStream)
{
var line = await reader.ReadLineAsync();
var values = line.Split(',');
var Newline = new RevenueLine();
Newline.ClubID = values[0];
Newline.Date = values[1];
Newline.Department = values[2];
Newline.Description = values[3];
Newline.Chits = Convert.ToInt32(values[4]);
Newline.Sales = values[5];
await UpdatePOS_Monitor(Newline);
}
}
private async Task UpdatePOS_Monitor(RevenueLine line)
{
using (HttpClient client = new HttpClient())
{
string json = JsonConvert.SerializeObject(line);
HttpResponseMessage wcfResponse = await client.PostAsync(API_Address, new StringContent(json, Encoding.UTF8, "application/json"));
}
}
另请注意await reader.ReadLineAsync
,await UpdatePOS_Monitor(Newline)
以及catch {}
内UpdatePOS_Monitor
的删除(吞下此类异常几乎总是一个坏主意。)