我不知道如何调用此方法的最后一部分:
private static async Task ForEachFileAsync(string path, string searchPattern, SearchOption searchOption, Func<string, Task> doAsync)
{
// Avoid blocking the caller for the initial enumerate call.
await Task.Yield();
foreach (string file in Directory.EnumerateFiles(path, searchPattern, searchOption))
{
await doAsync(file);
}
}
到目前为止,这是我设法做到的:
private void Stats_Load(object sender, EventArgs e)
{
ForEachFileAsync(@"E:\Path", "*", SearchOption.TopDirectoryOnly, what to put here? );
}
我不需要解释System.Func的工作原理!!我只需要知道如何使用System.Func进行方法调用,而该方法在“ Can someone explain what the C# "Func<T,T>" does?”中找不到。
Adriani6的回答是最好的,也是最有帮助的。谢谢
答案 0 :(得分:2)
简短回答:async (file) => /*perform async operation*/
如Microsoft Docs所述,Func(函数)用于指定方法。
这与Action的工作方式非常相似,异常Actions返回Void,而Function返回最后一个通用参数。例如:
Func<int, int, string>
将采用以下方法作为参数:
string AddNumbers(int value1, int value2)
{
return (value1 + value2).ToString()
}
对于Task,由于与Tasks一起实现了语法糖,因此可以使用标记为Async的方法执行Await操作。例如:
Func<string, Task>
将采用以下方法作为参数:
async Task AddNumbers(string url)
{
var client = new HttpClient();
await client.PostAsync(url);
}
Lamda表达式是内联方法的简写形式。因此async (url) => await new HttpClient().PostAsync(url);
与上面编写的方法相同。
在这种情况下,您可能只想在硬盘上执行一些异步读/写操作。
答案 1 :(得分:1)
您想将委托传递给该方法,该方法接受字符串并返回从签名System.Func<in T, out TResult>
提取的Task ..
private static Task DoSomething(string task)
{
throw new NotImplementedException();
}
您将对该方法进行引用。
ForEachFileAsync(@"E:\Path", "*", SearchOption.TopDirectoryOnly, (str) => DoSomething(str));
您显然不希望throw new NotImplementedException();
的正文中出现DoSomething
...您想要实现自己的方法。