Вызов метода с помощью задачи doasync - PullRequest
0 голосов
/ 29 августа 2018

Я не могу понять, как вызвать последнюю часть этого метода:

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, который НЕ БЫЛ найден в ". Может кто-нибудь объяснить, что делает C #" Func "? ".

Adriani6 ответ был лучшим и самым полезным. Спасибо

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Краткий ответ: async (file) => /*perform async operation*/


Как описано в Документах Microsoft , Func (функция) используется для указания метода.

Это очень похоже на работу Action, исключение Actions возвращает Void, тогда как Functions возвращает последний универсальный параметр. Например:

Func<int, int, string> Примет следующий метод в качестве аргумента:

string AddNumbers(int value1, int value2)
{
    return (value1 + value2).ToString()
}

В случае Задачи из-за синтаксического сахара, реализованного вместе с Задачами, вы можете выполнять операции Await с помощью метода, помеченного как Async. Например:

Func<string, Task> Примет следующий метод в качестве аргумента:

async Task AddNumbers(string url)
{
    var client = new HttpClient();
    await client.PostAsync(url);
}

Выражения Lamda являются сокращениями для встроенных методов. Так что async (url) => await new HttpClient().PostAsync(url); такой же, как метод, описанный выше.

В этом случае вы, вероятно, просто захотите выполнить некоторую асинхронную операцию чтения / записи на жестком диске.

0 голосов
/ 29 августа 2018

Вы хотите передать делегат тому методу, который принимает строку и возвращает задачу .. взятый из подписи System.Func<in T, out TResult>

private static Task DoSomething(string task)
{
    throw new NotImplementedException();
}

И вы бы поместили эту ссылку на этот метод ..

ForEachFileAsync(@"E:\Path", "*", SearchOption.TopDirectoryOnly, (str) => DoSomething(str));

Вы, очевидно, не хотите throw new NotImplementedException(); в теле DoSomething ... вы хотите реализовать свой собственный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...