Асинхронные задачи в консольном приложении C# в сочетании с Windows .Forms - PullRequest
0 голосов
/ 25 января 2020

Допустим, у меня есть 10 задач, которые должны запускаться одновременно, визуализируя их прогресс, используя GUI. Для простоты пусть они будут счетчиками от 1 до 100. Основным приложением должно быть консольное приложение. GUI элементы управления должны генерироваться на лету. Вот код, который я написал:

static void Main(string[] args)
        {

            Enumerable.Range(0, 10).ToList().ForEach(x =>
                                                    frm.Controls.Add(new Label()
                                                    {
                                                        Left = 10,
                                                        Top = 22 * x,
                                                     }));

            Thread mThread = new Thread(delegate ()
            {
                frm.ShowDialog();
            });

            mThread.SetApartmentState(ApartmentState.STA);
            mThread.Start();

            Jobs();
         }

static void Jobs()
        {
            Task[] tasks = new Task[10];

            for (int i = 0; i < tasks.Length; i++)
            {
                tasks[i] = PayLoad(i);
            }

            Task.WaitAll(tasks);

        }

static async Task PayLoad(int taskNumber)
        {

            Console.WriteLine($"Task {taskNumber} is starting...");
            //await Task.Delay(1000);

            for (int i = 1; i < 100; i++)
            {

                Console.WriteLine($"Task {taskNumber} - iteration {i}    ");

                Action act = delegate () { frm.Controls[taskNumber].Text = i.ToString(); };
                frm.BeginInvoke(act);
                await Task.Delay(1000);
            }

        }

Проблема в том, что прогресс останавливается, когда все счетчики достигают 1. Если я комментирую 2-й, жду, код завершается, но я вижу, что он работает синхронно. Все ярлыки заполнены одна за другой. Я что-то пропустил?

...