Уроки C# - Потоки, Thread, Invoke, Action, delegate, Parallel.Invoke - C#
2019 ж. 6 Мам.
95 049 Рет қаралды
Донаты и на кофе ➜ t.me/win10tweaker/171
Эксклюзив для спонсоров ➜ / xpuct
Если недоступна спонсорка ➜
В этом видео Вы узнаете всё о потоках, а также, как решить проблему:
Недопустимая операция в нескольких потоках: попытка доступа к элементу управления не из того потока, в котором он был создан (The calling thread cannot access this object because a different thread owns it).
Форум по C#:
win10tweaker.ru/forum/forum/%...
#Потоки #Thread #Многопоточность #Invoke #Action #delegate #Parallel.Invoke #СиSharp #СиШарп
Отличное объяснение. По делегатам действительно нет ни одного нормального объяснения, только видел пример на коллекции (посчитать к примеру сумму элементов с доп фильтром допустим только четные и т.п.). Эти доп фильтры делать делегатами, и в основном коде вызывать нужный делегат. Но этот пример не живой, ведь вместо всего этого можно использовать лямбда-выражения или вообще LINQ. Другой пример, который встречал - это применение делагатов в обратных вызовах, но там опять же у нас есть события. Т.е. делегаты в чистом виде в нормальном коде не встретишь.
Вы когда-либо с Event-ами работали? Там делегаты очень применимы. Эдакое сюрное объяснение "с потолка", но когда случится что-то такое делать, оно само по идее в голову придёт, что нужен такой механизм. Так вот пример: Я -- создатель некоторого события "раздача плова в тарелочке с вилочкой" и я раздаю плов, а ко мне приходят люди за пловом в тарелочке и за вилочкой. Эти люди -- делегаты. И вот я раздаю весь такой, а что будет дальше с этим пловом и одноразовой посудой я класть хотел, а люди-то разные: один съест, другой сделает себе из тарелочки воображаемую шапочку, третий обмажется пловом, четвёртый пойдёт мастерить из него взрывчатку... Но твоя (моя т.е.) задача не меняется, я всего лишь раздаю это. А ещё более просто и реально -- это, собственно, о делегировании обязанностей в реальном мире. Например: Вы - интернет-магазин. Вы продаёте товары и Вы ведёте доставку курьерами. Вы формируете заказы к отправке, а куча курьеров их доставляют, но Вася на велосипеде, Петя общественным транспортом, Вова на машине, а Дима вообще рулит большой почтовой службой и выполняет авиа-перевозки. Третий пример: отправка 1 оповещения (новости) в разные соц-сети одной кнопкой. Вы указали, что на событие реагируют только делегаты, принимающие такой-то набор параметров, из которых состоит ваша новость, например (заголовок и содержание) и всё, море обработчиков может обрабатывать эти данные и заниматься их публикацией каждый в своей соц-сети. Издатель же новости в свою очередь лишён головной боли о том как же эту новость опубликовать везде. Он делегировал эту обязанность другим, и эти другие -- делегаты.
@@absamurai про интернет-магазин прям из языка снял. Вот пример с рынком: тебе нужна малина? Ты идешь на рынок(к примеру) или в любое удобное место где её можно купить. Ты не идешь на огород и не обращаешься к владельцу производства потому что это неудобно. Так вот тетя Зина - это делегат.
Делегаты придумали именно для событийного программирования. Смысл в том что делегат может иметь множество ссылок на разнице методы (техника подписки и отписки на собитие, хотя в обёртке события самый обычный делегат). Главное что бы сигнатура подходила. + Лямбда выражение (тоже делегат предикат). Так то все делегаты уже придуманы свои пишешь если не знаешь системного. Такие как Action, Func, Predicat, и т.д. Урок хорош!)
@@absamurai Чел с WindowsForms не работал похоже, там все события на делегатах
Мне приходилось использовать делегаты, чтобы обновлять значения в режиме реального времени в таблице datagridview в WinForm. Было клиент-северное приложение, на клиенте был запущен поток, который получал данные от сервера и заносил инфу в таблицу. Код обновления данных в таблице выполнялся внутри делегата, иначе возникла ошибка, точное описание не помню, но че то там с доступом. Ниже приведен упрощенный фрагмент кода, где использовался делегат. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) // получить данные { while (client.Connected == true) // пока клиент подключен { lock (locker) // для синхронизации потоков { // получение и обработка данных this.Invoke(new MethodInvoker(delegate { // обновление данных в таблице })); } }; }
Просмотрел все уроки. Всё понятно, кратко и по существу. Большое спасибо. Если есть возможность, сделай урок по проблематике защиты кода от дизасемблеров и вообще насколько вероятно сохранить алгоритм программы в секрете.
ХрисТ, ты даже не представляешь себе какой ты молодец. Тебя очень приятно слушать и многие вещи становятся понятнее, чем раньше. Знать и донести это две разные вещи и ты владеешь обоими.
обойи вещи
@@gennadysmirnov5362 Что? Обои вещи, Чем? обоими вещами. Учи русский!!!
Уроки бомбезные,и как только ты все это запоминаешь,мне бы твоё мастерство.Браво👍👍
Добрый день уважаемый. Спасибо за общение с Вами.
Вот это объяснил))). Сколько видосов про потоки смотрел, этот прям с первого раза зашел. Прям все по человечески объяснил, на простом языке. Спасибо. С меня лайк и подписка
Какие же прекрасные уроки. Информация очень понятная, а видео очень приятно смотреть. Спасибо
Реально живое, человеческое объяснение. Спасибо автору за адекватный канал.
Тайны делегатов раскрыты. Ох сколько я их гуглил. За Parallel отдельное спасибо, это что-то с чем-то.
Хорошо, что я нарвался на тебя почти в самом начале. Спасибо.
Очень круто, спасибо большое за эти уроки. Все очень доступно и понятно, что огромная редкость.
Спасибо вам огромное !!! Вот уже миллион англоязычных туториалов посмотрела, но лучше вас еще нигде не объяснили, ни на каком языке !
Спасибо автору за такую подачу материала! Очень круто, что объяснение идёт бегло, понятно и НЕ на задротском языке:)
Про язык действительно ценно. Очень живо слушается.
Да-да-да))) ...Это очень важно: это не важно!!! Но у вас останется...
Очень понятно объясняешь. Про if и else было все очень понятно. Спасибо!
Учитель года :) Ты очень хорошо объясняешь! Спасибо, добрый человек :)
Обычно, подобные уроки ставлю на скорость воспроизведения х1.5 или х2. Тут я впервые захотел чуть понизить скорость подачи :) А в целом круто, четкий грамотно сформулированный поток инфы. Думаю это максимум, что можно уложить в 30 минут, так что за более подробным и вдумчивым перевариванием нужно идти читать документацию. Спасибо за труд!
по-людски по-кайфу объясняешь, спасибо!
Очень грамотный подход! Очень доволен что нашел ваш канал! Подписка
Большое спасибо, за Ваш труд. У Вас очень хорошо получается!
Спасибо огромное за видео, очень помогло.
Это просто восхитительно !!! Можно мне такого препода ? А ? Сколько каналов перелопатил, никто так понятно и находчиво не объясняет, просто вау !
Очень полезное видео - грамотно и доступным языком.
Огромное спасибо! Очень понятно. Сразу понял как лучше сделать
Отличное объяснение! Благодаря тебе у меня единственного в группе курсовая работа будет с потоками))
как хорошо что ты на эту тему видео записал
Спасибо, посмотрела сначала про async await, где все доступным языком разложено по полочкам
Это было сильно! Спасибо!
2 год работаю программистом C#, и понимаю что много чего еще не знаю. По опыту скажу, автор, ты просто красавчик, объясняешь как надо
Популярное заблуждение, что надо всё-всё знать. Надо знать достаточно :) НО - далеко не всё!
Второе популярное заблужнение, что чем дольше работаешь - тем профессиональнее становишься. Можно и 10 лет неправильно машину водить :-)
Давно видео не выходило, надеюсь у вас всё хорошо. Был бы рад увидеть уроки по EF (core), либо что-нибудь другое связанное с бд. Спасибо!
Очень занят пока. Будут новые видео ;) Много.
Про делегаты приведу пример. Есть метод который вызывается для заполнения progressBar, и вот у нас где-то там в другом классе, в другом пространстве имен есть метод который считывает огромный файл, и для этого мы создадим делегат и передадим как параметр, чтоб увидеть прогресс выполнения/чтения файла. Для событий без делегатов не обойтись
О, христ, я не знал, что ты пилишь уроки). Давно откладывал многопоточку, после шилда так и не вернулся к ней, думаю это жирный намек)
Спасибо за видос. Теперь многое стало чуть яснее.
Круто!!! Понятно, и без соплежуйства, спасибо!
Спасибо за урок, единственный урок после которого я понял как использовать Thread
Очень доходчиво объясняешь, скобки правильно расставляешь, так лучше, чем в строку. Юмора как раз столько, сколько надо) Если возможно - уменьши область захвата видео до размера окна виртуалки, т.к. мелкие символы на 720P не видно нормально (Инет 3G, живу вдали от цивилизации)
Спасибо большое! Но я хотел услышать про ТреэдПул)))
Большое спасибо за Ваш труд. Привет из Болгарии ... 🙂
Для меня самое простое объяснение делегата - ссылка на метод или список ссылок на группу методов. Нужны они для удобства, когда какое-то событие может вызывать различные методы, которые в свою очередь определяются в рантайме, а не на стадии компиляции. В зависимости от каких-то условий или действий пользователя мы можем вызвать тот или иной метод, а так же целый список методов, меняя его при необходимости. Написал все нужные методы, а потом просто тупо добавляешь на них ссылку в делегат или убирай из него. Может плюсы делегатов не особо очевидны, когда метод один и он либо вызывается событием, либо нет и третьего не дано. Но когда присутствует большая вариативность поведения, то делегаты могут очень помочь.
Да, абсолютно верно, наконец-то я тоже до этого допёр!) В данном видео не показана одна важная функция делегатов - это расширения списка методов делегата через простую операцию «+=». Это супер удобно при работе в рантайме
я тебя обожаю, умоляю делай еще видео
Потрясающе!
Уроки просто топ. Спасибо
Спасибо за урок, покажи плиз как работать с EF 6(связи, работа с данными и т.п.)
Ааааааа, ты лучший!!!!! Спасибо большое за видео)
Очень хорошее видео, спасибо !
Присоединяюсь ко всем словам благодарности. Спасибо за проделанную работу! Хочу дать обратную связь. (13:09) В строчку или в столбик записан код на экране не очень принципиально. Есть только одно пожелание. Увеличьте, пожалуйста, размер шрифта кода. Если смотреть с телефона, то почти ничего не видно. Спасибо!) PS. На 150% увеличении комфортно (15:35) 🙂
Большое Спасибо.
Классное видео, на тему потоков) Не могли бы снять как одновременно в потоках выполнять одну задачу?
К делегатам добавлю некоторое пояснение. Да делегат в простом варианте является конвертером члена класса "метод" в объект, что-бы с методом можно было обращаться как с любым другим объектом (перемеренные, поля, свойства, параметры и тд.). Делегаты из таких структур появились достаточно рано и стали базисом для последующего синтаксического сахара такие как анонимные методы (как мы собираемся обращаться к анонимному методу если у него нету имени), лямбда-выражения (немного функционального программирования из F# и Омега# в C# которые просто красиво написанные анонимные методы) и типы делегаты Action(0...P16) и Func(return,0...P16) (очень сильно упрощают жизнь если нужны всевозможные колбеэки и актуаторы и последнее это события (события и есть делегат только более красиво написанный, события можно и на чистых делегатах написать, толком разницы нету кроме красивости кода). А живой пример смотри на само слово делегат что в переводе на русский является представитель по типу торговых представителей (орифлеймы всякие), послы в посольствах государственных по нормальному это государственные представители и так далее. Если что-то как-то надо представлять каким либо образом это вот делегат. А так это выросло из шаблона проектирования который так и называется делегат (иногда как шаблон делегирования)
Спасибо за видео! Отлично всё разъяснено в ролике. Планируете ли снимать ролики по алгоритмам, паттернам? Было бы здорово коснуться темы DI, IoC -контейнеров.
Да, после ещё несколько тем в Windows Forms приступим к WPF сразу же на MVVM.
По моему, необходимость делегатов хорошо объясняет паттерн "Стратегия". Пример такой: У тебя есть определённая стратегия работы. Например: строительство коттеджного посёлка. И у тебя есть проекты строительства домов, дома все похожие, отличаются только в мелочах. Одна из задач в каждом проекте - выкопать котлован под фундамент. Так вот, в каких-то случаях ты можешь загнать туда чернорабочих, и они выкопают (т.к. например, экскаватор туда не проедет). В другом случае на эту же задачу ты отправишь мини-экскаватор. В третьем случае ты отправишь мощный экскаватор с отбойником, (т.к. там к примеру, там находится особо крепкий грунт). Так и в программировании - у нас есть общий метод, с командами - выкопать фундамент, подготовить основание, сделать опалубку, залить фундамент и т.д. а какими методами ты будешь строить каждый конкретный дом - зависит от конкретной ситуации, которая задаётся в конкретном случае и с конкретными условиями.
Отлично объяснил. Спасибо.
Вот по таким видео можно даже научится кодить. И смотреть интересно, и много полезной информации.
Спасибо, перевел свой софт для сжатия игр во много поток, ускорил работу в 2-5 раз) Я еще использовал сплит списка строк, на мини списки по 3 элемента, чтобы обработка шла, в каждом потоке по 3 элемента, вместо всех элементов в одном потоке) Мозг лопнул, но по кайфу работает
Ты когда нибудь отдыхаешь? Спасибо тебе!
Я постоянно не мог найти инфу по этому всему, пытался нарыть инфу из самых странных источников, но тут нашел это видео, и просто любовь с первого взгляда
Вот спасибо, отлично объяснил.
Спасибо, огромное. Такую сложную тему объяснить настолько доступно. Наконец я чувствую,что смогу пользоваться этими инструментами нормально.
Аналогии автора просто 10 из 10.
Самое понятное объяснение. Еще бы окошко студии немножко увеличить чтобы не приглядываться... На экране еще много свободного места)
Хорошее объяснение. Лайк с меня
очень круто, многое понял! Осталось понять как сделать поток который бы выполнял задачи по записи и чтению файлов и передавал их в основной поток (привет из Unity и Monobehavior работающих в основном потоке)
Наконец то!!! Наконец-то я поняла эти ***чие делегаты!!!!!!
здравствуйте, можте снять создание телеграмм бота, только вместо async/await использовать Thread?
Мне понравилось объяснение про ружье и звонок)) А я когда проходил делегаты думал что если я не понимаю его применения на практике, то я че-то не так понял и вообще тупой)
Круто! Пошел переписывать свой проект ))
Делегат - можно понимать как callback функцию. Строготипизированный колбек дает большую гибкость. Во в первых - он гарантирует, что переданная лямбда соответствует сигнатуре, во вторых - внутри своего метода он позволяет на основании своей сигнатуры писать корректный в плане типов код, что помогает не заниматься отладкой 8 часов, в третьих - не обязательно в метод передавать лямбду, хоть иногда это, безусловно, удобно. list.Sort((a, b) => a.Id.CompareTo(b.Id)) например можно заменить на list.Sort(Sort.ById). Делегаты очень широко используются в мире функционального программирования, да и в классическом ООП (например, паттерн шаблонный метод)
Использовал делегат чтобы на одну кнопку вешать 2 метода(старт/стоп), т.е. кнопка вызывает делегат ,а дальше в методе к ему привязывается другой метод и второй клик по кнопке уже для совсем других действий. Может можно было реализовать проще, но это первое что в голову пришло)
Спасибо тебе. Сделай пожалуйста шрифт по больше. На телефоне сложно смотреть.
Можешь сделать урок по (Save / Load ) а так же про защиту сохранений ?
это просто лучшее объяснение !!!!!!!!!!!)))))
По делегатам, строим аналогию с C++. Функцию нельзя напрямую передать в функцию в качестве параметра. Но можно передать указатель (адрес, "делегат") / Даже в C++ не рекомендуют, в настоящее время, использовать указатели на функцию, а использовать класс Functional - аналог лямбда выражений в C#.
А есть ли в планах работа с ком объектами? Было бы здорово получить урок про ним. И что-то видосов новых нет). Очень ждём)))
спасибо , Дядь.
спасибо большое!!!
Спасибо! выручил! пиши пожалуйста в столбец -проще понимать.... ну по крайне мере мне)))
Как-то сжато, немного рвано, дёргано, но при этом класно получается ))
Спасибо огромное за урок, очень классное объяснение. Насчёт написания кода, как по мне, то в строчку лучше, и понятнее. Ещё вопрос, есть ли урок работе с процессами, и сетевое программирование ?
Будет позже 🤝
Советую очень серьезно относится к этому уроку, так как сложно без делегатов и без асинхронной/многопоточной программировании
Красивее конечно в одну строку. А как на самом деле записывать не важно. Единственное может быть затруднительно понять код тем у кого опыта мало. Лично я всегда смотрю оба варианта, так лучше понимаешь код и как его сокращать =)
Спасибо за видео! В одну строку мне кста больше код нравиться, если не очень длинная строка получается.
Орнул на делегатах :D Будут еще видео? Было бы супер про wpf послушать от тебя и про патерны.
Весьма вероятно 👍
Спасибо.
Спасибо
Нихрена не понял, но то что мне надо было я сделал xD спасибо )
Про делегаты. Предположим есть комната в которой нет ни окон ни дверей, задача в ней убраться: пропылесосить, протереть пыль. Для решения нужен тот кто уберет комнату и способ в эту комнату попасть. Представим что у нас есть Маша, Петя и Вася - все они могут убрать комнату. Теперь надо их в комнату как-то поместить, есть два варианта: 1) для каждого из них прорубить отдельный вход; 2) сделать ДВЕРЬ.
Предположим, что Маша, Петя и Вася хотят покушать. Есть вариант каждому кушать из своей тарелки, а можно кушать просто с КАСТРЮЛИ. Нет, не годится. Жду новых примеров. Кстати, после выхода этого видео, спустя какое-то время нашёл применение делегату - доступ к контролу из класса. Это боль...
@@XpucT Вопрос изначально был зачем? Ну он же вроде как для соплей) Ну типа есть 15 алгоритмов сортировки массива и какой-нибудь PrintTime() для подсчета времени работы каждого алгоритма. Мы делаем PrintTime(Action ... ) и норм, нет? Подобие функциональной обертки из плюсов.
У меня есть бутылка и она закрытая. "Открытие крышки" - вот наш делегат!. Мы можем открыть эту бутылку нормальным способом, а можно - ложкой; можно зубами тоже (если они здоровые), некоторые могут и глазом.
Когда следующий урок? Жду с нетерпением !!!
Будут ;)
делегат удобен тогда, когда тебе нужен список делегатов (то-есть у тебя есть методы 1,2,3,4,5,6,7) и ты хочешь их выполнять, у тебя есть список с этими методами типа хочу чтобы, выполнялись так 1,2,3,2,2,2,2,2,1,3,4,5 и ну это можно когда количество небольшое прописать вручную, а так существуют делегаты которые можно добавить в список и выполнять когда тебе нужно и в любой последовательности (станки чпу, сценарии какие-то)
Из того что знаю я deligate нужен как атрибут метода. Такой метод не имеет тела и нужен он чтобы запомнить сигнатуру. Например () когда есть коллекция свойств с разными атрибутами и у нас есть метод который возвращает все свойства с одним атрибутом, все свойства с другим и так далее...В этому случае можно написать метод обертку в который передается параметром коллекция и делигативный метод, который проверяет свойство на причастность к атрибуту. И тогда у нас будет не N методов по все атрибутам, а только 2 : один делигат и метод этот делигат использующий. Конкретно в тредах делигат видимо используется для того чтобы передать сигнатуру метода.
Живой пример использования делегатов. Вам нужно решить систему из 100 дифференциальных уравнений вида dy/dx =F(x, y1....y100). Правые части системы - функции F записываются как массив делегатов одинаковой сигнатуры. Но начинка внутри каждой функции - разная. Программа видит делегат и вызывает функцию нужного содержания с заданным набором аргументов. Это как указатель на функцию в С.
По поводу делегатов и директора как раз все понятно. Ты обращаешься именно не к человеку, а к тому, кто выполняет обязанности директора. Если директор в отпуске, за него ответит зам или секретарь, или хз кто. Тебе не важно, кто именно, какой именно человек, главное, чтобы он был уполномечен. А лямбда оператор - это всего лишь синтаксический сахар.
Обожаю c#, пользуюсь 2008 студией, потому что не люблю выкачивать тонны гигабайт и люблю легкие ide, уже тогда было столько фичей в нем. Тогда наверное он казался языком из будущего.
Респект
Неплохое видео, хоть я уже и опытный разработчик, что-то для себя все-равно подчерпнул, однако не раскрыта суть как Action позволяет менять контрол, и в чем разница между вызовом через лямбду, action и MethodInvoker
Спасибо за видео друг ! и Коту привет ! Вопрос . Запустить поток можно так: поток.Start(); а есть ли возможность остановить выполнение потока когда мне нужно ? или как "убить" поток в процессе работы программы ? Спасибо !
поток.Suspend(); - останавливает поток. Всё остальное гуглттьс по "C# работа с потоками".
По поводу делегатов, в основном используется другая их форма - события. Ну то есть события и есть делегаты, только более продвинутые. Ну уж я надеюсь, что никто не отрицает полезность событий)
Делегаты нужны для того, чтобы различные функции в качестве аргументов передавать в другие функции, чтобы потом эти переданные в качестве аргументов функции вызывались когда угодно, идеальный пример - конвейер компонентов Middleware для Asp.Net Core. Если ошибаюсь, поправьте
Скажите, для парсинга сайтов (получение страниц и извлечения из них данных) лучше использовать многопоточность или async?
async сегодня в любом вопросе предпочтительнее.
@@XpucT Спасибо!
Делегат это грубоговоря ссылка на метод. Все событийная модель на нем построена.
Спасибо большое, все довольно понятно и доходчиво. Планируете ли в дальнейшем делать видеоурок по тому как сделать собственные события и привязку к ним свои какие то данные?