简单C#异步等待-异步进程列表

简单C#异步等待-异步进程列表,c#,asynchronous,task,C#,Asynchronous,Task,请对我好一点,因为我知道这个问题已经被反复提到了。我就是想不起来。我有一个非常简单的工作:浏览文件列表并处理每个文件。等待它们全部完成,然后运行Finalize例程。我收到一条警告,要求我在通话结果中添加等待接线员。我这样做对吗?这是我的密码: async void btnProcess_Click(object sender, EventArgs e) { await processFiles(); Finalize(); } asyn

请对我好一点,因为我知道这个问题已经被反复提到了。我就是想不起来。我有一个非常简单的工作:浏览文件列表并处理每个文件。等待它们全部完成,然后运行Finalize例程。我收到一条警告,要求我在通话结果中添加等待接线员。我这样做对吗?这是我的密码:

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;
                }
            }
        }
    }       
async void btnProcess\u单击(对象发送方,事件参数e)
{
等待processFiles();
定稿();
}   
异步任务进程文件()
{
int i=0;
foreach(listBox1.Items中的字符串文件名)
{
进程(文件名);
i++;
}
回报(i);
}
异步任务无效进程(字符串文件名)
{  //  
//将CSV文件读入SQL数据库
}
私有void b选择文件\u单击(对象发送者,事件参数e)
{//将文件放入列表框中
字符串procesingDirectory=“C:\temp”;
FolderBrowserDialog FBD=新建FolderBrowserDialog();
FBD.SelectedPath=procesingDirectory;
FBD.Description=“选择文件”;
FBD.ShowNewFolderButton=false;
listBox1.Items.Clear();
如果(FBD.ShowDialog()==DialogResult.OK)
{
string[]files=Directory.GetFiles(FBD.SelectedPath);
Array.Sort(文件);
foreach(文件中的字符串文件)
{
如果(file.IndexOf(“.txt”)>0)
{
listBox1.Items.Add(文件);
}
if(file.IndexOf(finder)>0)
{
发现=真;
}
}
}
}       

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

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;
}
异步任务进程文件()
{
var processingTasks=新列表();
foreach(listBox1.Items中的字符串文件名)
{
Add(进程(文件名));
}
等待任务.WhenAll(处理任务);
返回processingTasks.Count;
}

编译器抱怨您正在使用异步方法,但未使用异步功能。似乎您希望在所有任务完成后继续。如果没有实际的代码,仍然很难说。您当前的实现确实采用了先发后忘的方法,并且不会等待任务完成。如果这是您想要的,您可以简单地使方法同步,并且如果正确实现,流程方法将异步运行。

Nice!非常感谢。所以wait应该与async调用位于同一个方法中?该方法前面的async表示将在该方法中使用wait。现在,等待在哪里取决于你正在解决的问题。通常,您会等待需要某种形式IO的操作(读/写文件、调用数据库、调用web服务)。此外,通常情况下,所有调用异步方法的方法都是异步的。下行投票和无注释是什么?我花了好几个小时读这篇文章,尝试了不同的东西,但我还是被卡住了。这不是帮助吗?