调用具有doasync任务的方法

时间:2018-08-29 11:08:32

标签: c# asynchronous

我不知道如何调用此方法的最后一部分:

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的回答是最好的,也是最有帮助的。谢谢

2 个答案:

答案 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 ...您想要实现自己的方法。