Асинхронная и параллельная обработка. Спать в методах - PullRequest
0 голосов
/ 28 октября 2019

Дано 10 изображений и команда, например, из 2 человек. Первый обрабатывает изображение за 1 минуту, второй за 2. Сколько времени занимает обработка?

Я создаю двух человек с более низкими значениями в секундах. И я вызываю метод process.

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

Конечно, ничего не работает. Я попытался .WhenAll, это не сработало.

Это должно быть около 7,5 секунд, а не 14. Screen

Main:

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Test.Controller;
using Test.View;
using Test.Model;

namespace Test
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Person person1 = new Person(1000);
            Person person2 = new Person(2000);

            List<Person> people = new List<Person> { person1, person2 };

            int images_amount = 10;
            int time_processing = await ProcessingImages.ExecuteAsync(images_amount, people);

            TimeProcessing.TimeExecute(time_processing);
        }
    }
}

Контроллер:

using System;
using System.Threading;
using System.Collections.Generic;
using System.Threading.Tasks;
using Test.Model;

namespace Test.Controller
{
    class ProcessingImages
    {
        static async public Task<int> ExecuteAsync(int images_amount, List<Person> people, int time_processing = 0)
        {
            List<Task> tasks = new List<Task>();

            foreach (Person p in people)
            {
                tasks.Add(Task.Run(() => Execute(ref images_amount, p.Speed)));
            }
            await Task<int>.WhenAll(tasks);

            foreach (Task<int> task in tasks)
            {
                time_processing += await task;
            }
            return time_processing;
        }

        static private int Execute(ref int images_amount, int seconds_per_image, int count = 0)
        {
            while (images_amount > 0)
            {
                images_amount--;
                count += seconds_per_image;
                Console.WriteLine("Start thread " + seconds_per_image);
                Thread.Sleep(seconds_per_image);
            }
            return count;
        }
    }
}

Вид:

using System;

namespace Test.View
{
    class TimeProcessing
    {
        static public void TimeExecute(int time_processing)
        {
            Console.WriteLine("Total time processing: {0} seconds", time_processing);
        }
    }
}

1 Ответ

0 голосов
/ 28 октября 2019

Вы просто ошибаетесь. Вы складываете время, которое вы сказали каждому потоку отложить, а не реальное время с момента начала первого до окончания последнего.

Если вы используете Stopwatch на самом деле, сколько времени это займет, это около 7 секунд:

var watch = new Stopwatch();
watch.Start();

int time_processing = await ProcessingImages.ExecuteAsync(images_amount, people);

watch.Stop();
Console.WriteLine("Total time processing: {0}ms", watch.ElapsedMilliseconds);
...