调用异步方法

时间:2014-05-03 01:13:27

标签: c# async-await

我是使用异步方法的新手,可以使用一些帮助。 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
        {
        }
    }

1 个答案:

答案 0 :(得分:2)

如果您正在使用async/await,则整个方法链必须是async,一直到根(例如,到UI控件事件处理程序)。在您的情况下,这意味着ReadInputFile必须是asyncUpdatePOS_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.ReadLineAsyncawait UpdatePOS_Monitor(Newline)以及catch {}UpdatePOS_Monitor的删除(吞下此类异常几乎总是一个坏主意。)