Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301

Простой способ взаимодействия потоков

06.07.2022, 09:39. Показов 754. Ответов 5

Студворк — интернет-сервис помощи студентам
Всем добрый день!

Я относительно недавно, начал разбираться в многопоточности, асинхронности, параллелизме и прочей по... прочими хорошими вещами.
Галопом пробежал по основным возможностям, это типа: async await, backgroundworker, thread, task. И вот что. Все материалы в интернете в основном посвящены безопасности потоков, как их создавать, как их оптимизировать, как ими управлять.. и т.п. Даже знаменитый сайте met$nit (не знаю можно ли его тут указывать), не даёт информации о том, как осуществить простое взаимодействие между двумя потоками? Из этого и следует вопрос:

Как осуществить простое взаимодействие между двумя потоками?
(а может верней было бы поставить вопрос, так: какой самый быстрый путь, для обмена данными между двумя потоками).

Под взаимодействием я имею в виду, передачу каких либо данных, между двумя потоками. Я слышал, что можно через делегат... И вот решил всё это, протестить и зашёл в тупик.

Создал простое консольное приложение и добавил на него форму (UserForms). Принцип работы такой: консоль постоянно ждёт ввода от пользователя (кроме клавиши Escape, это выход из консоли), а всё что вводит пользователь в консоль я бы хотел менять на значение у "Label1" на UserForm'е. Это я всё описал, чтобы как можно меньше ушло времени на чтение кода.

И сам код:



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
        static void Main(string[] args)
        {
 
            // Создание тестовой UserForm
            var myForm = new SomeDoForm();
            myForm.WindowState = FormWindowState.Maximized;
            var textBoxInformation = new Label();
            textBoxInformation.Size = new System.Drawing.Size(140, 140);
            textBoxInformation.Location = new System.Drawing.Point(30, 30);
            textBoxInformation.Name = "TextBixInfo";
            textBoxInformation.Text = "Begin Text For information";
            
            myForm.Controls.Add(textBoxInformation);
 
            var formThread = new Thread(() => Application.Run(myForm));
            formThread.Start(); // Запуск формы в отдельном потоке
 
            string tmpStr = string.Empty;
            while (true)
            {
 
                var tmpChar = Console.ReadKey();
 
                if (tmpChar.Key == ConsoleKey.Enter)
                {
                    Console.WriteLine("");
                    Console.WriteLine(tmpStr);
                    tmpStr = string.Empty;
                }
                else // Тут вопрос?
                {
                    tmpStr = tmpStr + tmpChar.KeyChar.ToString();
                    textBoxInformation.Text = tmpStr;   // Изменение текта Label на форме в основном потоке.
                }
 
                if (tmpChar.Key == ConsoleKey.Escape)
                {
                    break;
                }
 
 
            }
            Console.WriteLine("Выход из консоли!");
 
        }
На данном, этапе я получаю логичную ошибку, что пытаюсь поменять Label1 (у меня он называется: "textBoxInformation") на основной форме, в главном потоке (другом проще говоря), а форма крутится в другом потоке.

Всё сделанное здесь, исключительно в образовательных целях. Или вернее цели. Понять, как пробросить данные между потоками. Интересует, самый простой способ. Или может правильней было бы написать, самый быстрый способ. В общем, то что можно было бы понять новичку. А потом уже пускаться в пляс и дебри.

Вот как связать эти потоки? Как изменить label, при вводе пользователем текста в консоли.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.07.2022, 09:39
Ответы с готовыми решениями:

Простой способ записи данных
Добрый день. Ребят тут я задумался немного о том как лучше всего хранить историю записей. INI DATABASE или еще какие...

Простой способ удаленного вызова метода
Ребят можете привети пример кода для вызова метода в классе C# удаленно ? То есть есть программа сервер на которой есть некий класс...

Подскажите простой способ собрать OpenVPN
Добрый ден. подскажите более менее простой способ поднять openvpn приложением вида log pass IP.

5
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,138
Записей в блоге: 2
06.07.2022, 09:53
Лучший ответ Сообщение было отмечено Schumacher57 как решение

Решение

Schumacher57, передачи данных между потоками не бывает.
В потоке исполнятся метод и вмешаться в его работу невозможно.
Можно создать какой-то общий объект для разных методов.
И методы будут изменять/проверят его состояние.

Конкретно в вашем случае, проблема вовсе в другом.
Некоторые типы для обеспечения потокобезопасности позволяют работать с ними только в одном потоке.
Все методы которые работают с этим объектом вызываются по очереди и тем самым не конфликтуют друг с другом.
Для UI элементов Форм и WPF - это основной поток приложения (тот в котором оно открывается).

Для изменения UI элементов из других потоков надо сначала перейти в UI поток - то есть поставить в очередь этого потока метод который должен выполниться.

Для Форм см. 3. Как получить доступ к контролу из другого потока
1
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
06.07.2022, 10:05  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для Форм см. 3. Как получить доступ к контролу из другого потока
Ага, только вот как, раз наткунлся.

И да:
Цитата Сообщение от Элд Хасп Посмотреть сообщение
передачи данных между потоками не бывает.
В потоке исполнятся метод и вмешаться в его работу невозможно.
Можно создать какой-то общий объект для разных методов.
И методы будут изменять/проверят его состояние.
Вот это в целом, наверное и хотел услышать... Что получается взаимосвязать два потока, можно только через довольно не совсем тривиальные ... "манипуляции".
0
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,757
Записей в блоге: 1
06.07.2022, 10:41
Цитата Сообщение от Schumacher57 Посмотреть сообщение
получается взаимосвязать два потока, можно только через довольно не совсем тривиальные ... "манипуляции".
К сожалению да, так устроена среда исполнения, типа безопасность и всё такое.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,138
Записей в блоге: 2
06.07.2022, 10:43
Schumacher57, вам нужно немного глубже понять ООП.
В нём всё состоит из объектов и их членов.
Данные получать, отправлять могут только объекты.
А поток это только очередь инструкций для совершения этих действий.
1
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
06.07.2022, 10:55  [ТС]
Uswer, Элд Хасп,

Спасибо, больше за ответы!
Я выяснил, что хотел
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.07.2022, 10:55
Помогаю со студенческими работами здесь

Есть ли простой способ изменить символы в строке?
Добрый вечер, есть ли какой нибудь способ заменить сразу несколько символов в строке, то есть у меня есть например две строки в одной...

Простой способ получения строки/столбца двумерного массива
Подскажите, простой способ получения строки/столбца двумерного массива, если он конечно существует) Без перебора элементов есть что-нибудь ?

Зашифровать, перевернуть самый простой способ скрыть из исходника строку
Всем привет. Есть строка вида www://ххххххх.com - компилирую exe. При просмотре этого exe данный сайт можно найти без проблем. Как его...

Есть ли более простой и оптимальный способ решения данной задачи?
Добрый день! Ситуация следующая: Есть класс Event. public class Event { public string Name { get; set; } public...

Найти самый простой способ решения этой задачи с пояснением
У вас есть несколько камней известного веса w1, …, wn. Напишите программу, которая распределит камни в две кучи так, что разность весов...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru