Вроде то что нужно (По крайней мере выглядит так как хотелось). Буду пробовать.
По хорошему, DoSomething должен быть async, и в теле содержать вызовы асинхронных операций с префиксом await.
Вот как раз таки и хотелось, что бы очередь тасков была именно в HardWorker'е. Тогда получается, я у самого HardWorker'а добавлю поле t типа Tusk и добавление задачей будет происходить уже непосредственно в методе DoSomethingAsync:
class Program
{
static void Main(string[] args)
{
MainAsync(args).GetAwaiter().GetResult();
Console.ReadKey();
}
static async Task MainAsync(string[] args)
{
HardWorker hardWorker1 = new HardWorker();
HardWorker hardWorker2 = new HardWorker();
HardWorker hardWorker3 = new HardWorker();
HardWorker hardWorker4 = new HardWorker();
HardWorker hardWorker5 = new HardWorker();
Task t2 = Task.CompletedTask;
Task t3 = Task.CompletedTask;
Task t4 = Task.CompletedTask;
Task t5 = Task.CompletedTask;
Random rand = new Random();
for (int i = 0; i < 50; i++)
{
hardWorker1.DoSomethingAsync(1, rand.Next(1, 10000)));
hardWorker2.DoSomethingAsync(1, rand.Next(1, 10000)));
hardWorker3.DoSomethingAsync(1, rand.Next(1, 10000)));
hardWorker4.DoSomethingAsync(1, rand.Next(1, 10000)));
hardWorker5.DoSomethingAsync(1, rand.Next(1, 10000)));
}
await Task.WhenAll(t1, t2, t3, t4, t5);
}
}
public class HardWorker : AbstractHardWorker
{
public void DoSomething(int task, int time)
{
Console.Out.WriteLine("Start: " + task);
Thread.Sleep(time);
Console.Out.WriteLine("End: " + task);
}
}
public abstract class AbstractHardWorker
{
Task t;
public AbstractHardWorker()
{
t = Task.CompletedTask;
}
public abstract void DoSomething(int task, int time);
public void DoSomethingAsync(int task, int time)
{
t = t.ContinueWith(task => this.DoSomething(int task, int time));
}
}
Правда это не совсем то, о чем вы писали в комментарии к своему ответу)
Приведенный мною пример был упрощенной моделью реальной задачи.
В принципе, это близко к решению, которое я пытался получить, но:
1. В методе DoHardWork необходим параметр, так как он выполняет определенные операции на основе переданного в него значения. Как передать в него параметр при таком подходе?
2. Поскольку переданный в DoHardWork параметр преобразуется и сохраняется в массив (причем важно сохранить последовательность поступления значений), то необходимо, что бы все вызовы метода DoHardWork у конкретного Worker'а, были выполнены в той же последовательности, в которой они вызывались (добавлялись в список). Будут ли задачи в листе выполнятся последовательно или асинхронно друг от друга?
Все задачи являются операциями считывания из файла очередного байта и выполнения с ним определенных преобразований (с последующим добавление в массив). Разве могут несколько потоков считывать один и тот же файл?
Как решить данную задачу с использованием task'ов и модификаторов await/async?
P.S. а приведенную вами статью, я уже читал, как и некоторые другие, но прийти к решению своей задачи, основываясь на данной информации я так и не смог.
Ну почти, а нет каких нибудь статеек на данную тему? (на хабре например^^)
Установка скрипта - просто я хочу, чтобы было так:
Есть папка проекта, закидываешь ее на сервер, открываешь index.php.
А там сначала (при первом открытие) идет установка (ввод данных подключения к БД, после, скриптом, создаются таблиц и на напоследок, например, создание первого пользователя/админа).
Затем идет редирект на тот же адрес index.php, но теперь уже тут не установка, а сам проект (его главная страница и т.д.)
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Вот как раз таки и хотелось, что бы очередь тасков была именно в HardWorker'е. Тогда получается, я у самого HardWorker'а добавлю поле t типа Tusk и добавление задачей будет происходить уже непосредственно в методе DoSomethingAsync:
Правда это не совсем то, о чем вы писали в комментарии к своему ответу)