Запуск нескольких задач одновременно с использованием одного источника данных - PullRequest
1 голос
/ 10 апреля 2019

Итак, как я могу запустить несколько задач одновременно, используя в качестве ввода текстовый файл.

Загрузка исходных данных

var lines = File.ReadAllLines("file.txt")

Выполнить задачи

forearch(var line in lines)
{
   //I want to execute 3 tasks and each task needs to receive a line. At the end of each task he should pick up another line that has not been used and continue to the end of the file.

}

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

Вы смотрели на Parallel.ForEach?

используйте как:

Parallel.ForEach(File.ReadLines("file.txt"), new ParallelOptions { MaxDegreeOfParallelism = 3 }, line => { \\ do stuff })
0 голосов
/ 10 апреля 2019

Вы можете попробовать это:

private static async Task Main(string[] args) {
  const ushort concurrentWorkers = 5;
  var lines = File.ReadAllLines("file.txt");

  var concurrentSourceQueue = new ConcurrentQueue<string>(lines);

  var worker = Enumerable.Range(0, concurrentWorkers)
    .Select(_ => DoWorkAsync(concurrentSourceQueue));

  await Task.WhenAll(worker);
}

private static async Task DoWorkAsync(ConcurrentQueue<string> queue) {
  while (queue.TryDequeue(out var item)) {
    //process line here
  }
}
0 голосов
/ 10 апреля 2019

Может быть, что-то вроде этого:

async void Main()
{
    var lines = File.ReadAllLines("file.txt");
    int i = 0;
    var concurrency = 3;
    while (i < lines.Length)
    {
        var tasks = new List<Task>(concurrency);
        for (int j = 0; j < concurrency && i < lines.Length; j++)
        {
            tasks.Add(MyMethod(lines[i++]));
        }
        await Task.WhenAll(tasks);
    }
}
public Task MyMethod(string s)
{
    return Task.CompletedTask;
}
...