简单C#异步等待 - 异步处理列表

时间:2016-11-20 00:48:24

标签: c# asynchronous task

请相信我,因为我知道这个问题已被反复提起。我无法理解我的大脑。我有一个非常简单的工作:浏览文件列表并处理每个文件。等待它们全部完成,然后运行Finalize例程。我收到一条警告,要求我在调用结果中添加一个Await运算符。我这样做了吗?这是我的代码:

async void btnProcess_Click(object sender, EventArgs e)
    {
        await processFiles();
        Finalize();
    }   


async Task<int> processFiles()
    {
        int i = 0;
        foreach (string fileName in listBox1.Items)
        {

              process(fileName);
              i++;

        }
        return (i);
    }

async Task void process(string fileName)
    {  //  
       // read a CSV file into an SQL database
    }

 private void btnSelectFiles_Click(object sender, EventArgs e)
    {   // get the files into the list box
        string procesingDirectory = "C:\temp";
        FolderBrowserDialog FBD = new FolderBrowserDialog();
        FBD.SelectedPath = procesingDirectory;
        FBD.Description = "Select Files";
        FBD.ShowNewFolderButton = false;
        listBox1.Items.Clear();

        if (FBD.ShowDialog() == DialogResult.OK)

        {
            string[] files = Directory.GetFiles(FBD.SelectedPath);
            Array.Sort(files);
            foreach (string file in files)
            {
                if (file.IndexOf(".txt") > 0)
                {
                    listBox1.Items.Add(file);
                }
                if (file.IndexOf(finder) > 0)
                {
                    found = true;
                }
            }
        }
    }       

1 个答案:

答案 0 :(得分:1)

不确定,因为您没有提供有关在流程方法中完成的实际异步工作的详细信息,但应该是这样的

async Task<int> processFiles()
{
    var processingTasks = new List<Task>();
    foreach (string fileName in listBox1.Items)
    {
          processingTasks.Add(process(fileName));
    }
    await Task.WhenAll(processingTasks);
    return processingTasks.Count;
}

编译器抱怨您使用的是异步方法但不使用异步功能。看来你想在完成所有任务后恢复。没有实际的代码仍然很难说。您当前的实现确实触发并忘记了方法,并且不等待任务完成。如果这是您想要的,您可以简单地使方法同步,并且如果正确实现,则进程方法将异步运行。