Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Дмитрий Паскаль
4 / 2 / 2
Регистрация: 25.02.2018
Сообщений: 50
1

Запустить асинхронный метод в цикле

15.08.2019, 14:05. Просмотров 834. Ответов 5

У меня есть асинхронный метод
C#
1
public async void ManyPZ(Source[] sources, string path)
Он выполняет вычисления несколько минут и несколько раз меняет содержимое формы, в конце создаёт файлы в папке. Раньше я вызывал его только один раз при событии нажатия, всё работало. Теперь мне нужно вызвать его при том же событии, но в цикле и с разными аргументами.
Когда я сделал это так
C#
1
2
3
4
5
6
7
8
9
        private void button1_Click(object sender, EventArgs e)
        {
            string[] dir = Expendator.ReadFile("WhereData.txt", true);
            for (int i = 0; i <dir.Length; i++)
            {
                var s = Source.SourcesWithFw(sourcesArray, dir[i]);
                 ManyPZ(s, dir[i]);
            }
        }
оказалось, что в цикле он только запускается, а потом уже вне цикла продолжает работу, то есть за пару секунд у меня как бы в разных потоках запускается несколько вариантов этого метода, и они выполняются одновременно, получается каша.
Когда я попробовал его запустить через await, получилась ошибка, что нельзя менять содержимое формы не из потока, в котором она была создана.

Как мне сделать, чтобы цикл не переходил на новую итерацию, пока не завершится этот метод, но при этом не запускать его в другом потоке, так как он должен менять содержимое формы? Какие ещё варианты есть?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2019, 14:05
Ответы с готовыми решениями:

Фоновый/асинхронный метод
Моя программа делает следующее: программа делит файл на части, затем с созданными частями...

Асинхронный метод + потоки
Всем привет! Возможно вопрос и дилетантский, поэтому заранее извиняюсь. Делаю парсер сайта, на...

Не работает асинхронный метод SendAsync
Не срабатывает отправка через асинхронный метод SendAsync(). Пример взял прямо из msdn. Итак,...

Асинхронный метод долго (никогда?) не завершается
Добрый день. Вызываю асинхронный метод вот так: StockOrderInfo info; ...

Программа не дожидается, пока выполнится асинхронный метод
У меня есть два метода: public async static Task Challenge() //Авторизация в системе ...

5
M1ke423
17 / 13 / 4
Регистрация: 17.08.2015
Сообщений: 94
Завершенные тесты: 5
15.08.2019, 14:09 2
Лучший ответ Сообщение было отмечено Дмитрий Паскаль как решение

Решение

C#
1
2
3
4
5
6
7
8
9
private async void button1_Click(object sender, EventArgs e)
        {
            string[] dir = Expendator.ReadFile("WhereData.txt", true);
            for (int i = 0; i <dir.Length; i++)
            {
                var s = Source.SourcesWithFw(sourcesArray, dir[i]);
                 await ManyPZ(s, dir[i]);
            }
        }
так работать будет?
0
kolorotur
Эксперт .NET
11986 / 9533 / 2441
Регистрация: 17.09.2011
Сообщений: 16,249
Завершенные тесты: 1
15.08.2019, 14:13 3
C#
1
public async Task ManyPZ(Source[] sources, string path)
C#
1
2
3
4
5
6
7
8
9
        private void button1_Click(object sender, EventArgs e)
        {
            string[] dir = Expendator.ReadFile("WhereData.txt", true);
            for (int i = 0; i <dir.Length; i++)
            {
                var s = Source.SourcesWithFw(sourcesArray, dir[i]);
                await ManyPZ(s, dir[i]);
            }
        }
Добавлено через 52 секунды
Цитата Сообщение от Дмитрий Паскаль Посмотреть сообщение
Когда я попробовал его запустить через await, получилась ошибка, что нельзя менять содержимое формы не из потока, в котором она была создана.
Интересно посмотреть что за черная магия происходит в методе ManyPZ, что с await вылетает исключение, а без него не вылетает.
0
Дмитрий Паскаль
4 / 2 / 2
Регистрация: 25.02.2018
Сообщений: 50
15.08.2019, 14:21  [ТС] 4
Да ничего особенного, просто некоторые компоненты формы скрываются либо показываются, пару раз делает чтение полей. Всё типа такого:
C#
1
2
3
4
5
            zlims(sources.Length);
            пределыПоОсиZПриПромежуточномРисованииToolStripMenuItem.Enabled = false;
            groupBox2.Hide();
            groupBox6.Hide();
            GetFields();
Добавлено через 4 минуты
Кажется, заработало, хотя это очень странно. Разве есть разница между

C#
1
async void Method() + await Task.Run(()=>Method())
и

C#
1
async Task Method() + await Method()
??
0
V_Monomax
1339 / 1194 / 20
Регистрация: 09.08.2011
Сообщений: 2,197
Записей в блоге: 1
Завершенные тесты: 1
15.08.2019, 14:39 5
Цитата Сообщение от Дмитрий Паскаль Посмотреть сообщение
Разве есть разница между
есть, в первом случае вы задаете новый таск(поток), а во втором просто в том же потоке, но асинхронно от самого потока исполняете метод.
0
kolorotur
Эксперт .NET
11986 / 9533 / 2441
Регистрация: 17.09.2011
Сообщений: 16,249
Завершенные тесты: 1
15.08.2019, 15:14 6
Цитата Сообщение от Дмитрий Паскаль Посмотреть сообщение
некоторые компоненты формы скрываются либо показываются, пару раз делает чтение полей.
А зачем он тогда объявлен как асинхронный, если в нем нет асинхронности?

Цитата Сообщение от Дмитрий Паскаль Посмотреть сообщение
Кажется, заработало
Кажется, async там вообще ни к чему — уберите его из объявления метода и вызывайте как обычный void.
0
15.08.2019, 15:14
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2019, 15:14

Socket.Send + Async & Await: свой асинхронный метод отправки данных
Привет. Хочу написать свой асинх. метод для отправки данных при помощи класса Socket и его метода...

Метод в цикле, не работает геренарция случайных чисел
Обнаружила такую особенность. Есть метод с использованием генератора случайных чисел, результат...

Запустить метод в отдельном потоке
Всем доброго времени суток. Столкнулся с такой проблемой, на форму добавил элемент timer1, который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru