Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 3

Простой вызов функций в параллельных потоках

26.07.2017, 18:46. Показов 1568. Ответов 3

Студворк — интернет-сервис помощи студентам
Задача кажется стандартной, но хорошего решения не нашёл.

Имеется форма с окнами настроек и кнопками, по нажатию которых вызываются различные функции public класса. Функций много, в них передаются различные наборы данных. Функции возвращают числа и массивы.
Но время их работы может оказаться большим, и хочется запускать их отдельными потоками, чтобы во время выполнения можно было отображать процесс в ProgressBar, а также останавливать счёт по нажатию кнопки "Отмена" на форме.

Вроде бы самое прямое решение здесь - использовать System.Threading, но, если я правильно понял, чтобы запустить через объект Thread функцию, получающую на вход набор переменных, придётся для каждого такого набора (кроме самых простых) создавать класс. А результаты выполнения функций, видимо, придётся сохранять в глобальные переменные?

С одной-двумя функциями это можно было бы сделать, но когда их десятки - по-моему, получится очень громоздкая конструкция. Нет ли более простых способов?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.07.2017, 18:46
Ответы с готовыми решениями:

Парсинг страниц в параллельных потоках
знаю что скорее всего никто не поможет, но всё же) есть метод который с каждой страницы сайта считывает определённое слово, и таких страниц...

Лямбда Выражение как простой вызов функции.
Здравствуйте, подскажите несведующему, чтобы использовать лямбда выражения нужен делегат и и какое -то возвращаемое значение. А вот...

Вызов функций из DLL на С++
В программе:using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

3
Эксперт .NET
 Аватар для Rius
13092 / 7651 / 1672
Регистрация: 25.05.2015
Сообщений: 23,293
Записей в блоге: 14
26.07.2017, 19:08
Цитата Сообщение от SergTeor Посмотреть сообщение
придётся для каждого такого набора (кроме самых простых) создавать класс.
Это нормально. Ну ещё есть Tuple<>.
Цитата Сообщение от SergTeor Посмотреть сообщение
Нет ли более простых способов?
Task (.Net 4.0) и async/await (.Net 4.5).
1
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 3
27.07.2017, 09:18  [ТС]
Спасибо! Tuple точно пригодится, остальное буду пробовать.
0
0 / 0 / 0
Регистрация: 26.07.2017
Сообщений: 3
05.08.2017, 15:28  [ТС]
Да, async/await действительно оказалось именно тем, чего не хватало.
Большинство примеров используют асинхронный вызов функций, возвращающих Task или Task<T>, вроде WebClient().DownloadStringTaskAsync(), но для ситуации, похожей на мою, когда надо вызывать обычные вычислительные функции, видимо, самый простой вариант выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
private async void button_Start_Click(object sender, EventArgs e)
{
    //Асинхронно в параллельном потоке запускается функция MyFunction,
    //после чего программа продолжает обычную работу в основном потоке
    double result = await Task<double>.Run(() => MyFunction(param1, param2, param3));
 
    //В эту точку программа возвращается после завершения выполнения функции MyFunction
    //и может обработать полученный результат
    MessageBox.Show("Получен результат: "+ result.ToString());
}
а, например, для void функции без параметров await строка будет выглядеть так:
C#
1
await Task.Run(() => MyFunction());
Удобно, что в самой вызываемой функции MyFunction при этом вообще ничего менять не надо, и возможность её синхронного использования никак не изменилась.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2017, 15:28
Помогаю со студенческими работами здесь

Вызов API функций
Как вызывать в C# API функции, например вот эту BOOL CALLBACK MonitorEnumProc( __in HMONITOR hMonitor, __in HDC hdcMonitor, ...

Заполнение векторов в параллельных потоках
Доброе время суток! Имеется несколько векторов, задача заключается в том,чтобы заполнить их значениями в функциях, дабы это...

Обработка множества файлов в параллельных потоках
День добрый, уважаемые форумчане. Прошу помочь с моим камнем преткновения &quot;Потоками&quot;. Имеется задача: На диске существует папка...

Организовать рандом в параллельных процессах(потоках)
как организовать рандом в параллельных процессах(потоках)? про rand() и srand(time(0)) в main знаю но т.к. в одно время и в разных...

Пара загадочных функций в потоках
atomic_compare_and_exchange_bool_acq ((struct pthread **) arg,NULL,THREAD_SELF); __free_tcb() Кто имел дело с этими функциями -...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru