请相信我,因为我知道这个问题已被反复提起。我无法理解我的大脑。我有一个非常简单的工作:浏览文件列表并处理每个文件。等待它们全部完成,然后运行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;
}
}
}
}
答案 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;
}
编译器抱怨您使用的是异步方法但不使用异步功能。看来你想在完成所有任务后恢复。没有实际的代码仍然很难说。您当前的实现确实触发并忘记了方法,并且不等待任务完成。如果这是您想要的,您可以简单地使方法同步,并且如果正确实现,则进程方法将异步运行。