C # Не удается преобразовать из 'void' в 'System.Threading.Tasks.Task - PullRequest
0 голосов
/ 04 сентября 2018

После поиска я не нашел связанной темы с моей проблемой, так что вот так:

Из-за ограничения услуги, которую мы вызываем, мы планируем запускать заранее определенное количество запросов на обслуживание параллельно каждый раз. Код:

        public static void RunConcurrentThreads(List<Item> list, Action<Item> action, int nNumberOfConcurrentThreads = 3)
    {
        for (int i = 0; i < list.Count; i++)
        {

            var taskList = new List<Task>();

            for (int j = 0; j < nNumberOfConcurrentThreads; j++)
            {
                if (i + j < list.Count)
                {
                    taskList.Add(action(list[i + j]));
                }
                else
                {
                    break;
                }
            }

            if (taskList.Count > 0)
            {
                Task.WaitAll(taskList.ToArray());
            }

            i = i + nNumberOfConcurrentThreads;
        }
    }

«Item» - это класс, который определяет объект, с которым мы имеем дело.

"action" - это метод void, который принимает один объект Item в качестве параметра. Метод вызовет службу, а затем сохранит возвращенную информацию в базу данных. Для завершения требуется около 0,5 - 1 секунды.

nNumberOfConcurrentThreads - это количество одновременных запросов, которые будут выполняться каждый раз.

Эта строка дает ошибку в заголовке

taskList.Add (действие (список [i + j]));

Так как исправить ошибку? Или есть лучший способ справиться с такой проблемой параллелизма?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Microsoft выполнила эту работу за вас с помощью параллельной библиотеки задач .

Просто используйте Parallel.ForEach и все просто.

using System.Threading.Tasks;

static void RunConcurrentThreads(List<Item> list, Action<Item> action, int nNumberOfConcurrentThreads = 3)
{
    Parallel.ForEach
    (
        list,
        new ParallelOptions { MaxDegreeOfParallelism = nNumberOfConcurrentThreads  }
        i => action(i)
    );
}

Хотя это выглядит как цикл, в действительности среда выполнения создает поток для каждой итерации (до указанного предела) и запускает их параллельно.

0 голосов
/ 04 сентября 2018

Action ничего не возвращает. Если вы хотите запустить его в Task, вам нужно вызвать Task.Run, который запускает действие в отдельном потоке и возвращает задачу:

taskList.Add(Task.Run(() => action(list[i + j]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...