Отличное объяснение. По делегатам действительно нет ни одного нормального объяснения, только видел пример на коллекции (посчитать к примеру сумму элементов с доп фильтром допустим только четные и т.п.). Эти доп фильтры делать делегатами, и в основном коде вызывать нужный делегат. Но этот пример не живой, ведь вместо всего этого можно использовать лямбда-выражения или вообще LINQ. Другой пример, который встречал - это применение делагатов в обратных вызовах, но там опять же у нас есть события. Т.е. делегаты в чистом виде в нормальном коде не встретишь.
Вы когда-либо с Event-ами работали? Там делегаты очень применимы. Эдакое сюрное объяснение "с потолка", но когда случится что-то такое делать, оно само по идее в голову придёт, что нужен такой механизм. Так вот пример: Я -- создатель некоторого события "раздача плова в тарелочке с вилочкой" и я раздаю плов, а ко мне приходят люди за пловом в тарелочке и за вилочкой. Эти люди -- делегаты. И вот я раздаю весь такой, а что будет дальше с этим пловом и одноразовой посудой я класть хотел, а люди-то разные: один съест, другой сделает себе из тарелочки воображаемую шапочку, третий обмажется пловом, четвёртый пойдёт мастерить из него взрывчатку... Но твоя (моя т.е.) задача не меняется, я всего лишь раздаю это. А ещё более просто и реально -- это, собственно, о делегировании обязанностей в реальном мире. Например: Вы - интернет-магазин. Вы продаёте товары и Вы ведёте доставку курьерами. Вы формируете заказы к отправке, а куча курьеров их доставляют, но Вася на велосипеде, Петя общественным транспортом, Вова на машине, а Дима вообще рулит большой почтовой службой и выполняет авиа-перевозки. Третий пример: отправка 1 оповещения (новости) в разные соц-сети одной кнопкой. Вы указали, что на событие реагируют только делегаты, принимающие такой-то набор параметров, из которых состоит ваша новость, например (заголовок и содержание) и всё, море обработчиков может обрабатывать эти данные и заниматься их публикацией каждый в своей соц-сети. Издатель же новости в свою очередь лишён головной боли о том как же эту новость опубликовать везде. Он делегировал эту обязанность другим, и эти другие -- делегаты.
@@absamurai про интернет-магазин прям из языка снял. Вот пример с рынком: тебе нужна малина? Ты идешь на рынок(к примеру) или в любое удобное место где её можно купить. Ты не идешь на огород и не обращаешься к владельцу производства потому что это неудобно. Так вот тетя Зина - это делегат.
Делегаты придумали именно для событийного программирования. Смысл в том что делегат может иметь множество ссылок на разнице методы (техника подписки и отписки на собитие, хотя в обёртке события самый обычный делегат). Главное что бы сигнатура подходила. + Лямбда выражение (тоже делегат предикат). Так то все делегаты уже придуманы свои пишешь если не знаешь системного. Такие как Action, Func, Predicat, и т.д. Урок хорош!)
Мне приходилось использовать делегаты, чтобы обновлять значения в режиме реального времени в таблице datagridview в WinForm. Было клиент-северное приложение, на клиенте был запущен поток, который получал данные от сервера и заносил инфу в таблицу. Код обновления данных в таблице выполнялся внутри делегата, иначе возникла ошибка, точное описание не помню, но че то там с доступом. Ниже приведен упрощенный фрагмент кода, где использовался делегат. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) // получить данные { while (client.Connected == true) // пока клиент подключен { lock (locker) // для синхронизации потоков { // получение и обработка данных this.Invoke(new MethodInvoker(delegate { // обновление данных в таблице })); } }; }
ХрисТ, ты даже не представляешь себе какой ты молодец. Тебя очень приятно слушать и многие вещи становятся понятнее, чем раньше. Знать и донести это две разные вещи и ты владеешь обоими.
Просмотрел все уроки. Всё понятно, кратко и по существу. Большое спасибо. Если есть возможность, сделай урок по проблематике защиты кода от дизасемблеров и вообще насколько вероятно сохранить алгоритм программы в секрете.
Вот это объяснил))). Сколько видосов про потоки смотрел, этот прям с первого раза зашел. Прям все по человечески объяснил, на простом языке. Спасибо. С меня лайк и подписка
Для меня самое простое объяснение делегата - ссылка на метод или список ссылок на группу методов. Нужны они для удобства, когда какое-то событие может вызывать различные методы, которые в свою очередь определяются в рантайме, а не на стадии компиляции. В зависимости от каких-то условий или действий пользователя мы можем вызвать тот или иной метод, а так же целый список методов, меняя его при необходимости. Написал все нужные методы, а потом просто тупо добавляешь на них ссылку в делегат или убирай из него. Может плюсы делегатов не особо очевидны, когда метод один и он либо вызывается событием, либо нет и третьего не дано. Но когда присутствует большая вариативность поведения, то делегаты могут очень помочь.
Да, абсолютно верно, наконец-то я тоже до этого допёр!) В данном видео не показана одна важная функция делегатов - это расширения списка методов делегата через простую операцию «+=». Это супер удобно при работе в рантайме
К делегатам добавлю некоторое пояснение. Да делегат в простом варианте является конвертером члена класса "метод" в объект, что-бы с методом можно было обращаться как с любым другим объектом (перемеренные, поля, свойства, параметры и тд.). Делегаты из таких структур появились достаточно рано и стали базисом для последующего синтаксического сахара такие как анонимные методы (как мы собираемся обращаться к анонимному методу если у него нету имени), лямбда-выражения (немного функционального программирования из F# и Омега# в C# которые просто красиво написанные анонимные методы) и типы делегаты Action(0...P16) и Func(return,0...P16) (очень сильно упрощают жизнь если нужны всевозможные колбеэки и актуаторы и последнее это события (события и есть делегат только более красиво написанный, события можно и на чистых делегатах написать, толком разницы нету кроме красивости кода). А живой пример смотри на само слово делегат что в переводе на русский является представитель по типу торговых представителей (орифлеймы всякие), послы в посольствах государственных по нормальному это государственные представители и так далее. Если что-то как-то надо представлять каким либо образом это вот делегат. А так это выросло из шаблона проектирования который так и называется делегат (иногда как шаблон делегирования)
Обычно, подобные уроки ставлю на скорость воспроизведения х1.5 или х2. Тут я впервые захотел чуть понизить скорость подачи :) А в целом круто, четкий грамотно сформулированный поток инфы. Думаю это максимум, что можно уложить в 30 минут, так что за более подробным и вдумчивым перевариванием нужно идти читать документацию. Спасибо за труд!
По моему, необходимость делегатов хорошо объясняет паттерн "Стратегия". Пример такой: У тебя есть определённая стратегия работы. Например: строительство коттеджного посёлка. И у тебя есть проекты строительства домов, дома все похожие, отличаются только в мелочах. Одна из задач в каждом проекте - выкопать котлован под фундамент. Так вот, в каких-то случаях ты можешь загнать туда чернорабочих, и они выкопают (т.к. например, экскаватор туда не проедет). В другом случае на эту же задачу ты отправишь мини-экскаватор. В третьем случае ты отправишь мощный экскаватор с отбойником, (т.к. там к примеру, там находится особо крепкий грунт). Так и в программировании - у нас есть общий метод, с командами - выкопать фундамент, подготовить основание, сделать опалубку, залить фундамент и т.д. а какими методами ты будешь строить каждый конкретный дом - зависит от конкретной ситуации, которая задаётся в конкретном случае и с конкретными условиями.
Делегат - можно понимать как callback функцию. Строготипизированный колбек дает большую гибкость. Во в первых - он гарантирует, что переданная лямбда соответствует сигнатуре, во вторых - внутри своего метода он позволяет на основании своей сигнатуры писать корректный в плане типов код, что помогает не заниматься отладкой 8 часов, в третьих - не обязательно в метод передавать лямбду, хоть иногда это, безусловно, удобно. list.Sort((a, b) => a.Id.CompareTo(b.Id)) например можно заменить на list.Sort(Sort.ById). Делегаты очень широко используются в мире функционального программирования, да и в классическом ООП (например, паттерн шаблонный метод)
У меня есть бутылка и она закрытая. "Открытие крышки" - вот наш делегат!. Мы можем открыть эту бутылку нормальным способом, а можно - ложкой; можно зубами тоже (если они здоровые), некоторые могут и глазом.
20:42 "New Thread, Старт! *Погнал*" Чет ору с этого, ахахахахахахахахахахахахахаха. Забавно вы это говорите и когда представляешь тоже ситуация забавная! (типа слишком быстро) Рождается и ему сразу старт, и он погнал
Я постоянно не мог найти инфу по этому всему, пытался нарыть инфу из самых странных источников, но тут нашел это видео, и просто любовь с первого взгляда
Использовал делегат чтобы на одну кнопку вешать 2 метода(старт/стоп), т.е. кнопка вызывает делегат ,а дальше в методе к ему привязывается другой метод и второй клик по кнопке уже для совсем других действий. Может можно было реализовать проще, но это первое что в голову пришло)
По делегатам, строим аналогию с C++. Функцию нельзя напрямую передать в функцию в качестве параметра. Но можно передать указатель (адрес, "делегат") / Даже в C++ не рекомендуют, в настоящее время, использовать указатели на функцию, а использовать класс Functional - аналог лямбда выражений в C#.
Спасибо, перевел свой софт для сжатия игр во много поток, ускорил работу в 2-5 раз) Я еще использовал сплит списка строк, на мини списки по 3 элемента, чтобы обработка шла, в каждом потоке по 3 элемента, вместо всех элементов в одном потоке) Мозг лопнул, но по кайфу работает
Присоединяюсь ко всем словам благодарности. Спасибо за проделанную работу! Хочу дать обратную связь. (13:09) В строчку или в столбик записан код на экране не очень принципиально. Есть только одно пожелание. Увеличьте, пожалуйста, размер шрифта кода. Если смотреть с телефона, то почти ничего не видно. Спасибо!) PS. На 150% увеличении комфортно (15:35) 🙂
Делегат это шаблон обертки для методов определенной сигнатуры указанной в определении делегата. После создания экземпляров делегатов в них можно помещать методы соответствующей сигнатуры. Также экземляры делегатов можно складывать и вычитать, при этом будут добавляться и удаляться методы внутри них. Зачем это надо? Ну, например для событий. Событие это по сути и есть делегат, обернутый в виде свойства. Можно добавлять в него ссылки на методы(подписываться) и удалять(отписываться). Компилятор создает делегаты неявно когда вы передаете лямбду в метод или подписываете метод на событие. Все делегаты имеют метод Invoke() который их вызывает. По сути делегаты это удобный метод хранения ссылок на методы и работы с ними. Грубо говоря как Object для переменных, только делегаты для методов.
По поводу делегатов и директора как раз все понятно. Ты обращаешься именно не к человеку, а к тому, кто выполняет обязанности директора. Если директор в отпуске, за него ответит зам или секретарь, или хз кто. Тебе не важно, кто именно, какой именно человек, главное, чтобы он был уполномечен. А лямбда оператор - это всего лишь синтаксический сахар.
Очень доходчиво объясняешь, скобки правильно расставляешь, так лучше, чем в строку. Юмора как раз столько, сколько надо) Если возможно - уменьши область захвата видео до размера окна виртуалки, т.к. мелкие символы на 720P не видно нормально (Инет 3G, живу вдали от цивилизации)
очень круто, многое понял! Осталось понять как сделать поток который бы выполнял задачи по записи и чтению файлов и передавал их в основной поток (привет из Unity и Monobehavior работающих в основном потоке)
Мне понравилось объяснение про ружье и звонок)) А я когда проходил делегаты думал что если я не понимаю его применения на практике, то я че-то не так понял и вообще тупой)
делегат удобен тогда, когда тебе нужен список делегатов (то-есть у тебя есть методы 1,2,3,4,5,6,7) и ты хочешь их выполнять, у тебя есть список с этими методами типа хочу чтобы, выполнялись так 1,2,3,2,2,2,2,2,1,3,4,5 и ну это можно когда количество небольшое прописать вручную, а так существуют делегаты которые можно добавить в список и выполнять когда тебе нужно и в любой последовательности (станки чпу, сценарии какие-то)
Спасибо за видео! Отлично всё разъяснено в ролике. Планируете ли снимать ролики по алгоритмам, паттернам? Было бы здорово коснуться темы DI, IoC -контейнеров.
По поводу делегатов, в основном используется другая их форма - события. Ну то есть события и есть делегаты, только более продвинутые. Ну уж я надеюсь, что никто не отрицает полезность событий)
Из того что знаю я deligate нужен как атрибут метода. Такой метод не имеет тела и нужен он чтобы запомнить сигнатуру. Например () когда есть коллекция свойств с разными атрибутами и у нас есть метод который возвращает все свойства с одним атрибутом, все свойства с другим и так далее...В этому случае можно написать метод обертку в который передается параметром коллекция и делигативный метод, который проверяет свойство на причастность к атрибуту. И тогда у нас будет не N методов по все атрибутам, а только 2 : один делигат и метод этот делигат использующий. Конкретно в тредах делигат видимо используется для того чтобы передать сигнатуру метода.
По поводу примера из жизни про делегаты. Жили-были крестьяне, которых царское самодержавие сильно угнетало. И тут приходит Ленин со своей советской властью. Крестьяне обрадовались, что сейчас им Ленин этой самой земли-то и прибавит. Вот только как об этом сказать Ленину? Есть вариант: каждый из крестьян идёт к Ленину и говорит: "Владимир Ильич, я крестьянин Иванов (Петров, Сидоров), мне бы земли побольше". Потом они почесали репу и решили, что так не пойдёт. Это получается, что вся деревня отправится в Петроград. Тут и красноармейцы по дороге могут остановить и расстрелять (ибо любая власть боится толпы народа), да и работать на земле кому-то нужно. Вот крестьяне и решили отправить Ленину одного Пахома. Так и говорят: "Ты, Пахом, будешь нашим делегатом. Как Ленин тебя спросит, мол, зачем пришёл, ты изложишь ему нашу задачу". Тут Иванов кричит: "и про меня не забудь". И Петров ему вторит: "и про меня тоже". Так все крестьяне дружно подписались на делегат. Чтобы как Ленин подписал свой указ, так чтобы он на всех распространился, кто к нему Пахома отправил.
Делегат это описание метода - типы входных параметров, тип результата, именно описание а не сигнатура. Отличие описания от сигнатуры - последняя включает имя метода и используется вообще для других целей. Экземпляр делегата это ссылка на метод соответствующий описанию. Реализация?)) События, колбэки и так далее. Я понимаю почему вы конструкции типа delegate(int arg) { return arg; } называете делегатами, вот только это не делегаты и даже не их экземпляры, это анонимные функции/методы, которые потом разбираются компилятором в делегат, сам метод и экземпляр делегата. В первом приближении лямбда выражения это синтаксический сахар анонимных функций, но это не так и у них есть отличия, например анонимные функции могут пропускать объявление аргументов, т.е. Action f = delegate { Console.Write("Hello"); }; f("world"); работает, а лямбда выражения нет, в то же время лямбда могут приводиться как к делегату, так и к дереву выражений, а анонимные функции только к делегату.
Живой пример использования делегатов. Вам нужно решить систему из 100 дифференциальных уравнений вида dy/dx =F(x, y1....y100). Правые части системы - функции F записываются как массив делегатов одинаковой сигнатуры. Но начинка внутри каждой функции - разная. Программа видит делегат и вызывает функцию нужного содержания с заданным набором аргументов. Это как указатель на функцию в С.
Спасибо огромное за урок, очень классное объяснение. Насчёт написания кода, как по мне, то в строчку лучше, и понятнее. Ещё вопрос, есть ли урок работе с процессами, и сетевое программирование ?
спустя 5 лет опять смотрю это видео. Столько событий произошло, а я заново пытаюсь вкатиться. Сейчас хотя бы работу нашел, но опять наткнулся на делегаты.
Делегаты нужны для того, чтобы различные функции в качестве аргументов передавать в другие функции, чтобы потом эти переданные в качестве аргументов функции вызывались когда угодно, идеальный пример - конвейер компонентов Middleware для Asp.Net Core. Если ошибаюсь, поправьте
Делегат это ссылка на метод (функцию, порядок неопределённых действий) который будет использован в классе или методе. Когда это может быть полезно? Когда хочешь сделать код универсальным без модификаций имплементации основного класса и в тоже время сделать код более компактным. LINQ прекрасный образчик универсальности. Например: вы вычисляете остаток по кредиту за период. вы можете всё сделать просто: в одном методе. а можете в определенный момент(как параметр метода или как атрибут класса) передать функцию по вычислению процента по кредиту какому-то пользователю класса. При этом вам не надо наследовать класс (в C# можно наследовать только от одного класса). Вы даже можете сделать ваш класс закрытым для модификации. По моему скромному мнению: В каком-то смысле делегаты(ссылка на метод) противопоставляет себя одному из принципов ООП: инкапсуляции.
Спасибо за видео друг ! и Коту привет ! Вопрос . Запустить поток можно так: поток.Start(); а есть ли возможность остановить выполнение потока когда мне нужно ? или как "убить" поток в процессе работы программы ? Спасибо !
Прошу прощения за тупой вопрос, но все же : почему при использовании MethodInvorker форма виснет и пока не закончиться цикл который прописан в потоке, т. Е. Я не могу выполнять другие действия на форме кнопку там нажать или проскролить форму
@@XpucT да... Я просто вообще не программист, а инженер автоматизированных систем контроля и раньше если что и писал, то в паскале (раньше это лет 10 назад) ... А тут начальство задачи поставила(а если не выполню то за забор пойду) и программу напиши и приложение на смартфон... А я только месяц назад сел учить C#... Каша в голове такая что капец... Спасибо, что хорошо все разжевываешь...
С await не понял, как работать. Есть код. К примеру, хочу чтобы что-то при нажатии на button выполнялось асинхронно. И хочу чтобы там же менялся текст в label1. async private void button1_Click(object sender, EventArgs e) { await Task.Run(() => { // какой-то код // обработка потока при Debug BeginInvoke((MethodInvoker)(() => { label1.Text = $"Число {result} является Doubleton"; label2.Text = "Результат готов"; })); }); } Но при таком коде ошибки в Debug нет, но зато вся асинхронность просто улетучивается. Более того асинхронность перестает работать даже в релизе без отладки. Пробовал и с action и с просто Invoke, что я делаю не так? :) И спасибо за видео !!!
при запуске простого кода, на форме курсор имеет форму песочных часов, а когда нажимаю Button, выскакивает страница с "ExceptionDispatchinfo.cs не найден".
@@XpucT Не так выразился. У меня есть TextBox и Button. И мне нужно по нажатию кнопки вызвать метод в потоке. В этом методе я прочитаю TextBox. А сам поток должен типо ждать пока я не нажму на кнопку. Ну вот как-то так.
@@leongames8347 Смотри, что Ты написал. Есть кнопка и она вызывает метод. Метод читает свойство Text из textBox1 Потом оказывается, что нужно ждать завершения потока, пока не нажмёшь кнопку. Так Ты уже нажал и вызвал метод. Давай лучше код, который написал. Добавь комменты, что делаешь, что ожидается и что получается по факту.
Обожаю c#, пользуюсь 2008 студией, потому что не люблю выкачивать тонны гигабайт и люблю легкие ide, уже тогда было столько фичей в нем. Тогда наверное он казался языком из будущего.
Классно, спасибо. Прикол (я из Израиля): на 4:50 когда говорил про кошерность я как раз собрался есть бутер колбасой и сыром, зашел в оффис верующий друг в ермолке. лол
Я все послушал. Суть уловил. Примеры, так себе, для узкого круга слушателей. На 6:33 стандартный метод работает. Потом все еще раз послушал, решил сделать как на 27:40 Этот способ вызывает ошибку. CS1061: "System.Threading.Thread" не содержит определение для "start". Не удалось найти метод расширения "start", принимающий первый аргумент типа "System.Threading.Thread" (пропущена директива using или ссылка на сборку?) В любом случае, стандартный метод мне помог, это то, что мне было нужно.
Красивее конечно в одну строку. А как на самом деле записывать не важно. Единственное может быть затруднительно понять код тем у кого опыта мало. Лично я всегда смотрю оба варианта, так лучше понимаешь код и как его сокращать =)
подскажите пожалуйста, как группу потоков thread запустить последовательно? Необходимо чтобы каждый последующий поток стартовал только после завершения предыдущего.
Посмотрите видео на канале про async, там пример, когда Task создаётся внутри метода, а также Task на сам метод. Это разные вещи и именно таким образом можно запускать их последовательно. Урок 15 ua-cam.com/video/oGxZuq2Ye2Q/v-deo.html
Спасибо за ответ! В данном случае я сглупил. Я пишу расширение для NXopen api, и пытался одну функцию api запустить в разных потоках (функция очень медленно выполняется, и в основном потоке нельзя запускать)...В итоге в отдельном потоке написал цикл обращения к функции. Taskи тоже пробовал, но они к сожалению не такие гибкие из-за необходимости статической обертки.
Кстати нашел отличный вариант последовательного запуска потоков с применением функции lock(). Ну и конечно стоит упомянуть что необходимо реализовывать catch (ThreadAbortException) { }. Уж очень долго не мог понять, почему же при закрытии дополнения у меня крашится основная программа.
Спасибо большое что простыми словами объясняешь! Супер! У меня вопрос: как приостановить поток с кнопки и потом опять с кнопки возобновить поток? С этим не могу разобраться...
Очень полезный урок! Спасибо большое! Мне стало интересно по вашему примеру сделать что-нибудь и я попытался объединить информацию из двух уроков. Этот урок и видео о прозрачности контролов. Но столкнулся с проблемой. Я решил немного запарится, создал два UserControl-a и захотел по кнопкам их переключать на основной форме. На основной форме создал "panelContet", в который загружаю UserControl-ы(кнопками вызываю разные). Потом захотелось, чтобы они были с эффектом исчезновения и появления при переключении (как в уроке с прозрачностью). Но не понимаю, какой правильный путь к этому эффекту сделать. Я делаю так: Загружаем UserControl в panelContent, всё он на форме => Далее хочу его сменить на другой => Запускаем код исчезновения боксов/лейблов => Очищаем panelContent И на загрузке другого UserControl-а я попадаю в задницу, ибо ничего не происходит :D private void button3_Click(object sender, EventArgs e) { //Находим UserControl в pnlContent var frm = pnlContent.Controls.Find(selectedContent, true).FirstOrDefault(); //Создаю новый поток для анимации исчезновения элементов UserControl new Thread(() => { //Обращаюсь сразу ко всем элементам UserControl Parallel.Invoke(() => { //Циклом снижаю прозрачность всех элементов foreach (var cntrl in frm.Controls) { //Снижаем прозрачность TransparencySub(cntrl); } }); }).Start(); //Не нашел иного метода, как реализовать очистку, мб есть лучше new Thread(() => { //Пока контролы исчезают, блокирую поток Thread.Sleep(1000); //Очищаю панель pnlContent.Controls.Clear(); }).Start(); //Здесь пытаюсь загрузить другой контрол new Thread(() => { Thread.Sleep(2500); AnswerBox ab = new AnswerBox(); selectedContent = ab.Name; pnlContent.Controls.Add(ab); ab.Dock = DockStyle.Fill; //Находим UserControl в pnlContent frm = pnlContent.Controls.Find(selectedContent, true).FirstOrDefault(); Parallel.Invoke(() => { foreach (var cntrl in frm.Controls) { //Увеличиваем прозрачность TransparencyAdd(cntrl); } }); }).Start(); } Можно узнать, что я могу делать не так?)
Привет 🖐 Вступление и код - это хорошо, но без понимания вступления не могу понять правильно подходишь к коду. Давай без кода пока. Опиши полностью, но минимальными требованиями, свою идею. Пример: Хочу, чтобы на форме была панель. Внутри панели две кнопки. И есть третья кнопка вне зоны панели. Нажимая на неё хочу анимацию тех двух кнопок, которые в панели. Напиши идею в таком стиле. Более понятно. Исходя из названия UserControl начинаю думать, что Ты слепил свой контрол, но не уверен. Поэтому не путай =) Пиши строже и точнее 👍
@@XpucT хорошо, давай попробуем) Можно сказать, да, я слепил свой UserControl. Стандартный, через Visual Studio => Проект => Добавить новый элемент => Пользовательский элемент управления(UserControl), но с минимальным функционалом. Я думаю, мне будет так проще организовать логику и сгруппировать контролы внутри этих форм. Представляют из себя максимум ссылки на лейбл/текстбокс, для объявления текста внутри них, не более. По итогу, получается так: Хочу, чтобы на форме было две кнопки (Menu1, Menu2) и панель(panelContent). Внутри панели переключались два UserControl-а, по нажатию кнопок Menu1 или Menu2. Нажимая на кнопку, например Menu1, один UserControl будет исчезать, а другой появляться. Код выше, это то, как я пытался это сделать :) Надеюсь в этот раз у меня вышло лучше) Заранее спасибо)
@@romanrudman5102 Я так понял, что речь идёт о такой концепции, как в Win 10 Tweaker. Слева у нас категории, Ты нажимаешь на LinkLabel слева, он скрывает все панели и отображает нужную. Нажимаешь на другой LinkLabel и он скрывает снова все панели и показывает нужную. В этом идея? Если да, то зачем делать отдельные контролы? Всё, что Тебе нужно - это LinkLabel и Panel. Ты кажется подходишь к вопросу так, как будто пишешь на WPF. Вот там да, лучше свои делать контролы. Но Твой вопрос там решается с помощью кастомного TabControl. На Windows Forms решается LinkLabel + Panel. Или Я что-то упустил?
@@XpucT Видимо да, получается, что идея похожа, но я не очень улавливаю, как вы собирали такое количество контролов на одной форме в разных panel?) Возможно вы создаете их динамически, каждый раз при вызове LinkLabel или же вы все элементы храните на одной форме...? Да, я знаю о WPF. Не хотелось бы с ним сталкиваться, совсем не понравился и проблем у него предостаточно внутренних. Хочется на WinForms и по возможности красиво :) Поэтому и пытаюсь реализовать описанный метод выше, но попадаю в просак с потоками, при переключении панелей. Но если вы предлагаете оставить эту идею, а как тогда сделать, чтобы при переключении панелей мы увидели, как контролы исчезли с одной панели и только потом выбралась другая и появились контролы на ней? У меня выходит, что при переключении он сразу же не дожидаясь исчезновения переходит на вторую панель и отрисовывает появление элементов на второй панели. В моем коде есть метод TransparencySub(cntrl); который сделан по вашему примеру, в него передаю контролы панелей.
@@romanrudman5102 закидываешь панель, в ней контролы. Сверху закидываешь такую же панель, но уже с другим контентом. И таких может быт сколько угодно. Все на одном уровне. Да, неудобно, однако вот так. То есть, если возвращаться к контролам первой панели в конструкторе нужно, то это боль. Но вот так вот. Нажатие на LinkLabel вызывает метод, который: foreach (Panel pnl in Controls.OfType()) if (pnl.Name.Contains("MainPanel")) pnl.Visible = false; И при этом показывает нужную панель. Двигаться нужно в этом ключе.
Не совсем понял причину того , что Вы в своем приложении (win tweaker) используете Thread , для выполнения задач в фоновом режиме . Почему не те же самые таски ? Ведь ту задачу можно было так же поместить в таск , перехватит событие закрытия формы , после чего свернуть приложение , к примеру в трей, и спокойно дожидаться когда оно завершит свою работу. Могу ошибаться , но те же майкросовт - тренеры советуют использовать TPL вместо работы с потоками напрямую.
Эээ неее. Task будет держать основной поток, как ни крути, а нужно, чтобы приложение точно закрылось, если оно фактически по требованию пользователя должно закрыться. При этом, утилита для сжатия файлов должна работать. Она, к слову, штатная, поэтому всё по фен-шую 👍
Отличное объяснение. По делегатам действительно нет ни одного нормального объяснения, только видел пример на коллекции (посчитать к примеру сумму элементов с доп фильтром допустим только четные и т.п.). Эти доп фильтры делать делегатами, и в основном коде вызывать нужный делегат. Но этот пример не живой, ведь вместо всего этого можно использовать лямбда-выражения или вообще 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 Что? Обои вещи, Чем? обоими вещами. Учи русский!!!
@@PK-yd4ki обеими
Реально живое, человеческое объяснение. Спасибо автору за адекватный канал.
Спасибо автору за такую подачу материала! Очень круто, что объяснение идёт бегло, понятно и НЕ на задротском языке:)
Про язык действительно ценно. Очень живо слушается.
Да-да-да)))
...Это очень важно: это не важно!!! Но у вас останется...
Просмотрел все уроки. Всё понятно, кратко и по существу. Большое спасибо. Если есть возможность, сделай урок по проблематике защиты кода от дизасемблеров и вообще насколько вероятно сохранить алгоритм программы в секрете.
Спасибо вам огромное !!! Вот уже миллион англоязычных туториалов посмотрела, но лучше вас еще нигде не объяснили, ни на каком языке !
Тайны делегатов раскрыты. Ох сколько я их гуглил. За Parallel отдельное спасибо, это что-то с чем-то.
Какие же прекрасные уроки. Информация очень понятная, а видео очень приятно смотреть. Спасибо
Вот это объяснил))). Сколько видосов про потоки смотрел, этот прям с первого раза зашел. Прям все по человечески объяснил, на простом языке. Спасибо. С меня лайк и подписка
Для меня самое простое объяснение делегата - ссылка на метод или список ссылок на группу методов. Нужны они для удобства, когда какое-то событие может вызывать различные методы, которые в свою очередь определяются в рантайме, а не на стадии компиляции. В зависимости от каких-то условий или действий пользователя мы можем вызвать тот или иной метод, а так же целый список методов, меняя его при необходимости. Написал все нужные методы, а потом просто тупо добавляешь на них ссылку в делегат или убирай из него. Может плюсы делегатов не особо очевидны, когда метод один и он либо вызывается событием, либо нет и третьего не дано. Но когда присутствует большая вариативность поведения, то делегаты могут очень помочь.
Да, абсолютно верно, наконец-то я тоже до этого допёр!) В данном видео не показана одна важная функция делегатов - это расширения списка методов делегата через простую операцию «+=». Это супер удобно при работе в рантайме
К делегатам добавлю некоторое пояснение. Да делегат в простом варианте является конвертером члена класса "метод" в объект, что-бы с методом можно было обращаться как с любым другим объектом (перемеренные, поля, свойства, параметры и тд.). Делегаты из таких структур появились достаточно рано и стали базисом для последующего синтаксического сахара такие как анонимные методы (как мы собираемся обращаться к анонимному методу если у него нету имени), лямбда-выражения (немного функционального программирования из F# и Омега# в C# которые просто красиво написанные анонимные методы) и типы делегаты Action(0...P16) и Func(return,0...P16) (очень сильно упрощают жизнь если нужны всевозможные колбеэки и актуаторы и последнее это события (события и есть делегат только более красиво написанный, события можно и на чистых делегатах написать, толком разницы нету кроме красивости кода). А живой пример смотри на само слово делегат что в переводе на русский является представитель по типу торговых представителей (орифлеймы всякие), послы в посольствах государственных по нормальному это государственные представители и так далее. Если что-то как-то надо представлять каким либо образом это вот делегат. А так это выросло из шаблона проектирования который так и называется делегат (иногда как шаблон делегирования)
Добрый день уважаемый. Спасибо за общение с Вами.
Учитель года :) Ты очень хорошо объясняешь! Спасибо, добрый человек :)
Самое понятное объяснение. Еще бы окошко студии немножко увеличить чтобы не приглядываться... На экране еще много свободного места)
Обычно, подобные уроки ставлю на скорость воспроизведения х1.5 или х2. Тут я впервые захотел чуть понизить скорость подачи :)
А в целом круто, четкий грамотно сформулированный поток инфы.
Думаю это максимум, что можно уложить в 30 минут, так что за более подробным и вдумчивым перевариванием нужно идти читать документацию.
Спасибо за труд!
По моему, необходимость делегатов хорошо объясняет паттерн "Стратегия". Пример такой: У тебя есть определённая стратегия работы. Например: строительство коттеджного посёлка. И у тебя есть проекты строительства домов, дома все похожие, отличаются только в мелочах. Одна из задач в каждом проекте - выкопать котлован под фундамент. Так вот, в каких-то случаях ты можешь загнать туда чернорабочих, и они выкопают (т.к. например, экскаватор туда не проедет). В другом случае на эту же задачу ты отправишь мини-экскаватор. В третьем случае ты отправишь мощный экскаватор с отбойником, (т.к. там к примеру, там находится особо крепкий грунт). Так и в программировании - у нас есть общий метод, с командами - выкопать фундамент, подготовить основание, сделать опалубку, залить фундамент и т.д. а какими методами ты будешь строить каждый конкретный дом - зависит от конкретной ситуации, которая задаётся в конкретном случае и с конкретными условиями.
Хорошо, что я нарвался на тебя почти в самом начале. Спасибо.
Это просто восхитительно !!! Можно мне такого препода ? А ? Сколько каналов перелопатил, никто так понятно и находчиво не объясняет, просто вау !
Очень понятно объясняешь. Про if и else было все очень понятно. Спасибо!
по-людски по-кайфу объясняешь, спасибо!
Делегат - можно понимать как callback функцию. Строготипизированный колбек дает большую гибкость. Во в первых - он гарантирует, что переданная лямбда соответствует сигнатуре, во вторых - внутри своего метода он позволяет на основании своей сигнатуры писать корректный в плане типов код, что помогает не заниматься отладкой 8 часов, в третьих - не обязательно в метод передавать лямбду, хоть иногда это, безусловно, удобно. list.Sort((a, b) => a.Id.CompareTo(b.Id)) например можно заменить на list.Sort(Sort.ById).
Делегаты очень широко используются в мире функционального программирования, да и в классическом ООП (например, паттерн шаблонный метод)
Уроки бомбезные,и как только ты все это запоминаешь,мне бы твоё мастерство.Браво👍👍
Спасибо большое!
Но я хотел услышать про ТреэдПул)))
Очень грамотный подход! Очень доволен что нашел ваш канал! Подписка
У меня есть бутылка и она закрытая. "Открытие крышки" - вот наш делегат!. Мы можем открыть эту бутылку нормальным способом, а можно - ложкой; можно зубами тоже (если они здоровые), некоторые могут и глазом.
Спасибо за урок, покажи плиз как работать с EF 6(связи, работа с данными и т.п.)
20:42 "New Thread, Старт! *Погнал*"
Чет ору с этого, ахахахахахахахахахахахахахаха. Забавно вы это говорите и когда представляешь тоже ситуация забавная! (типа слишком быстро)
Рождается и ему сразу старт, и он погнал
Очень полезное видео - грамотно и доступным языком.
Я постоянно не мог найти инфу по этому всему, пытался нарыть инфу из самых странных источников, но тут нашел это видео, и просто любовь с первого взгляда
Большое спасибо за Ваш труд. Привет из Болгарии ... 🙂
Очень круто, спасибо большое за эти уроки. Все очень доступно и понятно, что огромная редкость.
Использовал делегат чтобы на одну кнопку вешать 2 метода(старт/стоп), т.е. кнопка вызывает делегат ,а дальше в методе к ему привязывается другой метод и второй клик по кнопке уже для совсем других действий. Может можно было реализовать проще, но это первое что в голову пришло)
Спасибо, посмотрела сначала про async await, где все доступным языком разложено по полочкам
Большое спасибо, за Ваш труд. У Вас очень хорошо получается!
Аналогии автора просто 10 из 10.
По делегатам, строим аналогию с C++. Функцию нельзя напрямую передать в функцию в качестве параметра. Но можно передать указатель (адрес, "делегат") / Даже в C++ не рекомендуют, в настоящее время, использовать указатели на функцию, а использовать класс Functional - аналог лямбда выражений в C#.
Огромное спасибо! Очень понятно. Сразу понял как лучше сделать
Спасибо, перевел свой софт для сжатия игр во много поток, ускорил работу в 2-5 раз)
Я еще использовал сплит списка строк, на мини списки по 3 элемента, чтобы обработка шла, в каждом потоке по 3 элемента, вместо всех элементов в одном потоке) Мозг лопнул, но по кайфу работает
Присоединяюсь ко всем словам благодарности. Спасибо за проделанную работу!
Хочу дать обратную связь. (13:09) В строчку или в столбик записан код на экране не очень принципиально. Есть только одно пожелание. Увеличьте, пожалуйста, размер шрифта кода. Если смотреть с телефона, то почти ничего не видно. Спасибо!)
PS. На 150% увеличении комфортно (15:35) 🙂
Спасибо огромное за видео, очень помогло.
Отличное объяснение! Благодаря тебе у меня единственного в группе курсовая работа будет с потоками))
Спасибо за видос. Теперь многое стало чуть яснее.
Делегат это шаблон обертки для методов определенной сигнатуры указанной в определении делегата. После создания экземпляров делегатов в них можно помещать методы соответствующей сигнатуры. Также экземляры делегатов можно складывать и вычитать, при этом будут добавляться и удаляться методы внутри них. Зачем это надо? Ну, например для событий. Событие это по сути и есть делегат, обернутый в виде свойства. Можно добавлять в него ссылки на методы(подписываться) и удалять(отписываться). Компилятор создает делегаты неявно когда вы передаете лямбду в метод или подписываете метод на событие. Все делегаты имеют метод Invoke() который их вызывает. По сути делегаты это удобный метод хранения ссылок на методы и работы с ними. Грубо говоря как Object для переменных, только делегаты для методов.
По поводу делегатов и директора как раз все понятно. Ты обращаешься именно не к человеку, а к тому, кто выполняет обязанности директора. Если директор в отпуске, за него ответит зам или секретарь, или хз кто. Тебе не важно, кто именно, какой именно человек, главное, чтобы он был уполномечен. А лямбда оператор - это всего лишь синтаксический сахар.
Спасибо за урок, единственный урок после которого я понял как использовать Thread
Ты когда нибудь отдыхаешь? Спасибо тебе!
Очень доходчиво объясняешь, скобки правильно расставляешь, так лучше, чем в строку.
Юмора как раз столько, сколько надо)
Если возможно - уменьши область захвата видео до размера окна виртуалки, т.к. мелкие символы на 720P не видно нормально (Инет 3G, живу вдали от цивилизации)
как хорошо что ты на эту тему видео записал
Делегат это грубоговоря ссылка на метод. Все событийная модель на нем построена.
очень круто, многое понял! Осталось понять как сделать поток который бы выполнял задачи по записи и чтению файлов и передавал их в основной поток (привет из Unity и Monobehavior работающих в основном потоке)
Мне понравилось объяснение про ружье и звонок)) А я когда проходил делегаты думал что если я не понимаю его применения на практике, то я че-то не так понял и вообще тупой)
Как-то сжато, немного рвано, дёргано, но при этом класно получается ))
Спасибо, огромное. Такую сложную тему объяснить настолько доступно. Наконец я чувствую,что смогу пользоваться этими инструментами нормально.
О, христ, я не знал, что ты пилишь уроки). Давно откладывал многопоточку, после шилда так и не вернулся к ней, думаю это жирный намек)
делегат удобен тогда, когда тебе нужен список делегатов (то-есть у тебя есть методы 1,2,3,4,5,6,7) и ты хочешь их выполнять, у тебя есть список с этими методами типа хочу чтобы, выполнялись так 1,2,3,2,2,2,2,2,1,3,4,5 и ну это можно когда количество небольшое прописать вручную, а так существуют делегаты которые можно добавить в список и выполнять когда тебе нужно и в любой последовательности (станки чпу, сценарии какие-то)
Спасибо за видео! Отлично всё разъяснено в ролике.
Планируете ли снимать ролики по алгоритмам, паттернам? Было бы здорово коснуться темы DI, IoC -контейнеров.
Да, после ещё несколько тем в Windows Forms приступим к WPF сразу же на MVVM.
Красавчик! Все понятно
По поводу делегатов, в основном используется другая их форма - события. Ну то есть события и есть делегаты, только более продвинутые. Ну уж я надеюсь, что никто не отрицает полезность событий)
Из того что знаю я deligate нужен как атрибут метода.
Такой метод не имеет тела и нужен он чтобы запомнить сигнатуру.
Например () когда есть коллекция свойств с разными атрибутами и у нас есть метод который возвращает все свойства с одним атрибутом, все свойства с другим и так далее...В этому случае можно написать метод обертку в который передается параметром коллекция и делигативный метод, который проверяет свойство на причастность к атрибуту. И тогда у нас будет не N методов по все атрибутам, а только 2 : один делигат и метод этот делигат использующий.
Конкретно в тредах делигат видимо используется для того чтобы передать сигнатуру метода.
По поводу примера из жизни про делегаты. Жили-были крестьяне, которых царское самодержавие сильно угнетало. И тут приходит Ленин со своей советской властью. Крестьяне обрадовались, что сейчас им Ленин этой самой земли-то и прибавит. Вот только как об этом сказать Ленину?
Есть вариант: каждый из крестьян идёт к Ленину и говорит: "Владимир Ильич, я крестьянин Иванов (Петров, Сидоров), мне бы земли побольше". Потом они почесали репу и решили, что так не пойдёт. Это получается, что вся деревня отправится в Петроград. Тут и красноармейцы по дороге могут остановить и расстрелять (ибо любая власть боится толпы народа), да и работать на земле кому-то нужно.
Вот крестьяне и решили отправить Ленину одного Пахома. Так и говорят: "Ты, Пахом, будешь нашим делегатом. Как Ленин тебя спросит, мол, зачем пришёл, ты изложишь ему нашу задачу". Тут Иванов кричит: "и про меня не забудь". И Петров ему вторит: "и про меня тоже". Так все крестьяне дружно подписались на делегат. Чтобы как Ленин подписал свой указ, так чтобы он на всех распространился, кто к нему Пахома отправил.
Неплохо =)
Ааааааа, ты лучший!!!!! Спасибо большое за видео)
Спасибо тебе. Сделай пожалуйста шрифт по больше. На телефоне сложно смотреть.
Выходит, делегат - это инструмент, позволяющий волан-де-мортизировать метод, и к нему можно обращаться, не называя его имени, правильно?
Совершенно верно 👍
Делегат это описание метода - типы входных параметров, тип результата, именно описание а не сигнатура. Отличие описания от сигнатуры - последняя включает имя метода и используется вообще для других целей. Экземпляр делегата это ссылка на метод соответствующий описанию. Реализация?)) События, колбэки и так далее. Я понимаю почему вы конструкции типа delegate(int arg) { return arg; } называете делегатами, вот только это не делегаты и даже не их экземпляры, это анонимные функции/методы, которые потом разбираются компилятором в делегат, сам метод и экземпляр делегата. В первом приближении лямбда выражения это синтаксический сахар анонимных функций, но это не так и у них есть отличия, например анонимные функции могут пропускать объявление аргументов, т.е. Action f = delegate { Console.Write("Hello"); }; f("world"); работает, а лямбда выражения нет, в то же время лямбда могут приводиться как к делегату, так и к дереву выражений, а анонимные функции только к делегату.
Отлично объяснил. Спасибо.
Наконец то!!! Наконец-то я поняла эти ***чие делегаты!!!!!!
Очень хорошее видео, спасибо !
Живой пример использования делегатов. Вам нужно решить систему из 100 дифференциальных уравнений вида dy/dx =F(x, y1....y100). Правые части системы - функции F записываются как массив делегатов одинаковой сигнатуры. Но начинка внутри каждой функции - разная. Программа видит делегат и вызывает функцию нужного содержания с заданным набором аргументов. Это как указатель на функцию в С.
Спасибо огромное за урок, очень классное объяснение. Насчёт написания кода, как по мне, то в строчку лучше, и понятнее. Ещё вопрос, есть ли урок работе с процессами, и сетевое программирование ?
Будет позже 🤝
Давно видео не выходило, надеюсь у вас всё хорошо.
Был бы рад увидеть уроки по EF (core), либо что-нибудь другое связанное с бд.
Спасибо!
Очень занят пока. Будут новые видео ;) Много.
спустя 5 лет опять смотрю это видео. Столько событий произошло, а я заново пытаюсь вкатиться. Сейчас хотя бы работу нашел, но опять наткнулся на делегаты.
Потрясающе!
Когда следующий урок? Жду с нетерпением !!!
Будут ;)
Можешь сделать урок по (Save / Load ) а так же про защиту сохранений ?
Круто!!! Понятно, и без соплежуйства, спасибо!
Скажите, для парсинга сайтов (получение страниц и извлечения из них данных) лучше использовать многопоточность или async?
async сегодня в любом вопросе предпочтительнее.
@@XpucT Спасибо!
Делегаты нужны для того, чтобы различные функции в качестве аргументов передавать в другие функции, чтобы потом эти переданные в качестве аргументов функции вызывались когда угодно, идеальный пример - конвейер компонентов Middleware для Asp.Net Core. Если ошибаюсь, поправьте
Делегат это ссылка на метод (функцию, порядок неопределённых действий) который будет использован в классе или методе.
Когда это может быть полезно?
Когда хочешь сделать код универсальным без модификаций имплементации основного класса и в тоже время сделать код более компактным.
LINQ прекрасный образчик универсальности.
Например: вы вычисляете остаток по кредиту за период.
вы можете всё сделать просто: в одном методе.
а можете в определенный момент(как параметр метода или как атрибут класса) передать функцию по вычислению процента по кредиту какому-то пользователю класса. При этом вам не надо наследовать класс (в C# можно наследовать только от одного класса). Вы даже можете сделать ваш класс закрытым для модификации.
По моему скромному мнению: В каком-то смысле делегаты(ссылка на метод) противопоставляет себя одному из принципов ООП: инкапсуляции.
красавчик
Круто! Пошел переписывать свой проект ))
Классное видео, на тему потоков) Не могли бы снять как одновременно в потоках выполнять одну задачу?
Спасибо за видео друг ! и Коту привет ! Вопрос . Запустить поток можно так: поток.Start(); а есть ли возможность остановить выполнение потока когда мне нужно ? или как "убить" поток в процессе работы программы ? Спасибо !
поток.Suspend(); - останавливает поток.
Всё остальное гуглттьс по "C# работа с потоками".
Это было сильно! Спасибо!
Прошу прощения за тупой вопрос, но все же : почему при использовании MethodInvorker форма виснет и пока не закончиться цикл который прописан в потоке, т. Е. Я не могу выполнять другие действия на форме кнопку там нажать или проскролить форму
Потому что выполнение в том же потоке? =)
@@XpucT а...да... Точно... В том же потоке)))
@@DeXMask это случается, когда быстро учишься и в голове сразу много сценариев =)
@@XpucT да... Я просто вообще не программист, а инженер автоматизированных систем контроля и раньше если что и писал, то в паскале (раньше это лет 10 назад) ... А тут начальство задачи поставила(а если не выполню то за забор пойду) и программу напиши и приложение на смартфон... А я только месяц назад сел учить C#... Каша в голове такая что капец... Спасибо, что хорошо все разжевываешь...
С await не понял, как работать.
Есть код. К примеру, хочу чтобы что-то при нажатии на button выполнялось асинхронно. И хочу чтобы там же менялся текст в label1.
async private void button1_Click(object sender, EventArgs e)
{
await Task.Run(() => {
// какой-то код
// обработка потока при Debug
BeginInvoke((MethodInvoker)(() =>
{
label1.Text = $"Число {result} является Doubleton";
label2.Text = "Результат готов";
}));
});
}
Но при таком коде ошибки в Debug нет, но зато вся асинхронность просто улетучивается. Более того асинхронность перестает работать даже в релизе без отладки.
Пробовал и с action и с просто Invoke, что я делаю не так? :) И спасибо за видео !!!
Invoke((Action)(() => код
BeginInvoke не нужен тут.
это просто лучшее объяснение !!!!!!!!!!!)))))
я тебя обожаю, умоляю делай еще видео
при запуске простого кода, на форме курсор имеет форму песочных часов, а когда нажимаю Button, выскакивает страница с "ExceptionDispatchinfo.cs не найден".
Подскажите, как в работающем потоке взять из TextBox содержимое?
В каком смысле? Просто читаем напрямую без проблем.
@@XpucT Не так выразился. У меня есть TextBox и Button. И мне нужно по нажатию кнопки вызвать метод в потоке. В этом методе я прочитаю TextBox. А сам поток должен типо ждать пока я не нажму на кнопку. Ну вот как-то так.
@@leongames8347 Смотри, что Ты написал.
Есть кнопка и она вызывает метод.
Метод читает свойство Text из textBox1
Потом оказывается, что нужно ждать завершения потока, пока не нажмёшь кнопку.
Так Ты уже нажал и вызвал метод.
Давай лучше код, который написал. Добавь комменты, что делаешь, что ожидается и что получается по факту.
@@XpucT Все получилось.
Обожаю c#, пользуюсь 2008 студией, потому что не люблю выкачивать тонны гигабайт и люблю легкие ide, уже тогда было столько фичей в нем. Тогда наверное он казался языком из будущего.
Классно, спасибо. Прикол (я из Израиля): на 4:50 когда говорил про кошерность я как раз собрался есть бутер колбасой и сыром, зашел в оффис верующий друг в ермолке. лол
Я все послушал. Суть уловил.
Примеры, так себе, для узкого круга слушателей.
На 6:33 стандартный метод работает.
Потом все еще раз послушал, решил сделать как на 27:40
Этот способ вызывает ошибку.
CS1061: "System.Threading.Thread" не содержит определение для "start". Не удалось найти метод расширения "start", принимающий первый аргумент типа "System.Threading.Thread" (пропущена директива using или ссылка на сборку?)
В любом случае, стандартный метод мне помог, это то, что мне было нужно.
Спасибо! выручил! пиши пожалуйста в столбец -проще понимать.... ну по крайне мере мне)))
А закрывать то поток как? Или автоматом закроется?
Красивее конечно в одну строку. А как на самом деле записывать не важно. Единственное может быть затруднительно понять код тем у кого опыта мало. Лично я всегда смотрю оба варианта, так лучше понимаешь код и как его сокращать =)
подскажите пожалуйста, как группу потоков thread запустить последовательно? Необходимо чтобы каждый последующий поток стартовал только после завершения предыдущего.
Посмотрите видео на канале про async, там пример, когда Task создаётся внутри метода, а также Task на сам метод. Это разные вещи и именно таким образом можно запускать их последовательно. Урок 15
ua-cam.com/video/oGxZuq2Ye2Q/v-deo.html
Спасибо за ответ! В данном случае я сглупил. Я пишу расширение для NXopen api, и пытался одну функцию api запустить в разных потоках (функция очень медленно выполняется, и в основном потоке нельзя запускать)...В итоге в отдельном потоке написал цикл обращения к функции. Taskи тоже пробовал, но они к сожалению не такие гибкие из-за необходимости статической обертки.
Кстати нашел отличный вариант последовательного запуска потоков с применением функции lock(). Ну и конечно стоит упомянуть что необходимо реализовывать catch (ThreadAbortException) { }. Уж очень долго не мог понять, почему же при закрытии дополнения у меня крашится основная программа.
Спасибо большое что простыми словами объясняешь! Супер! У меня вопрос: как приостановить поток с кнопки и потом опять с кнопки возобновить поток? С этим не могу разобраться...
ua-cam.com/video/DQTmo-xGgZk/v-deo.html
@@XpucT спасибо огромное! Я сделала через if и все получилось! 😀
Христ, а что за музыка играет?
mounika. - let me see jon brion in wonderland
Спасибо за уроки.. А будет ли уроки по WEB api?
Очень может быть
В столбец - лучше для понимания. Мы же - изучающие. В строку конечно красивее, но и менее понятно.
Очень полезный урок! Спасибо большое!
Мне стало интересно по вашему примеру сделать что-нибудь и я попытался объединить информацию из двух уроков. Этот урок и видео о прозрачности контролов. Но столкнулся с проблемой. Я решил немного запарится, создал два UserControl-a и захотел по кнопкам их переключать на основной форме. На основной форме создал "panelContet", в который загружаю UserControl-ы(кнопками вызываю разные). Потом захотелось, чтобы они были с эффектом исчезновения и появления при переключении (как в уроке с прозрачностью). Но не понимаю, какой правильный путь к этому эффекту сделать. Я делаю так:
Загружаем UserControl в panelContent, всё он на форме =>
Далее хочу его сменить на другой =>
Запускаем код исчезновения боксов/лейблов =>
Очищаем panelContent
И на загрузке другого UserControl-а я попадаю в задницу, ибо ничего не происходит :D
private void button3_Click(object sender, EventArgs e)
{
//Находим UserControl в pnlContent
var frm = pnlContent.Controls.Find(selectedContent, true).FirstOrDefault();
//Создаю новый поток для анимации исчезновения элементов UserControl
new Thread(() =>
{
//Обращаюсь сразу ко всем элементам UserControl
Parallel.Invoke(() =>
{
//Циклом снижаю прозрачность всех элементов
foreach (var cntrl in frm.Controls)
{
//Снижаем прозрачность
TransparencySub(cntrl);
}
});
}).Start();
//Не нашел иного метода, как реализовать очистку, мб есть лучше
new Thread(() =>
{
//Пока контролы исчезают, блокирую поток
Thread.Sleep(1000);
//Очищаю панель
pnlContent.Controls.Clear();
}).Start();
//Здесь пытаюсь загрузить другой контрол
new Thread(() =>
{
Thread.Sleep(2500);
AnswerBox ab = new AnswerBox();
selectedContent = ab.Name;
pnlContent.Controls.Add(ab);
ab.Dock = DockStyle.Fill;
//Находим UserControl в pnlContent
frm = pnlContent.Controls.Find(selectedContent, true).FirstOrDefault();
Parallel.Invoke(() =>
{
foreach (var cntrl in frm.Controls)
{
//Увеличиваем прозрачность
TransparencyAdd(cntrl);
}
});
}).Start();
}
Можно узнать, что я могу делать не так?)
Привет 🖐
Вступление и код - это хорошо, но без понимания вступления не могу понять правильно подходишь к коду.
Давай без кода пока. Опиши полностью, но минимальными требованиями, свою идею.
Пример:
Хочу, чтобы на форме была панель. Внутри панели две кнопки. И есть третья кнопка вне зоны панели. Нажимая на неё хочу анимацию тех двух кнопок, которые в панели.
Напиши идею в таком стиле. Более понятно.
Исходя из названия UserControl начинаю думать, что Ты слепил свой контрол, но не уверен. Поэтому не путай =) Пиши строже и точнее 👍
@@XpucT хорошо, давай попробуем)
Можно сказать, да, я слепил свой UserControl. Стандартный, через Visual Studio => Проект => Добавить новый элемент => Пользовательский элемент управления(UserControl), но с минимальным функционалом. Я думаю, мне будет так проще организовать логику и сгруппировать контролы внутри этих форм. Представляют из себя максимум ссылки на лейбл/текстбокс, для объявления текста внутри них, не более.
По итогу, получается так:
Хочу, чтобы на форме было две кнопки (Menu1, Menu2) и панель(panelContent). Внутри панели переключались два UserControl-а, по нажатию кнопок Menu1 или Menu2. Нажимая на кнопку, например Menu1, один UserControl будет исчезать, а другой появляться.
Код выше, это то, как я пытался это сделать :)
Надеюсь в этот раз у меня вышло лучше) Заранее спасибо)
@@romanrudman5102 Я так понял, что речь идёт о такой концепции, как в Win 10 Tweaker.
Слева у нас категории, Ты нажимаешь на LinkLabel слева, он скрывает все панели и отображает нужную.
Нажимаешь на другой LinkLabel и он скрывает снова все панели и показывает нужную.
В этом идея? Если да, то зачем делать отдельные контролы?
Всё, что Тебе нужно - это LinkLabel и Panel.
Ты кажется подходишь к вопросу так, как будто пишешь на WPF. Вот там да, лучше свои делать контролы. Но Твой вопрос там решается с помощью кастомного TabControl. На Windows Forms решается LinkLabel + Panel. Или Я что-то упустил?
@@XpucT Видимо да, получается, что идея похожа, но я не очень улавливаю, как вы собирали такое количество контролов на одной форме в разных panel?) Возможно вы создаете их динамически, каждый раз при вызове LinkLabel или же вы все элементы храните на одной форме...?
Да, я знаю о WPF. Не хотелось бы с ним сталкиваться, совсем не понравился и проблем у него предостаточно внутренних. Хочется на WinForms и по возможности красиво :) Поэтому и пытаюсь реализовать описанный метод выше, но попадаю в просак с потоками, при переключении панелей.
Но если вы предлагаете оставить эту идею, а как тогда сделать, чтобы при переключении панелей мы увидели, как контролы исчезли с одной панели и только потом выбралась другая и появились контролы на ней?
У меня выходит, что при переключении он сразу же не дожидаясь исчезновения переходит на вторую панель и отрисовывает появление элементов на второй панели.
В моем коде есть метод TransparencySub(cntrl);
который сделан по вашему примеру, в него передаю контролы панелей.
@@romanrudman5102 закидываешь панель, в ней контролы.
Сверху закидываешь такую же панель, но уже с другим контентом.
И таких может быт сколько угодно. Все на одном уровне. Да, неудобно, однако вот так.
То есть, если возвращаться к контролам первой панели в конструкторе нужно, то это боль. Но вот так вот.
Нажатие на LinkLabel вызывает метод, который:
foreach (Panel pnl in Controls.OfType())
if (pnl.Name.Contains("MainPanel"))
pnl.Visible = false;
И при этом показывает нужную панель.
Двигаться нужно в этом ключе.
Не совсем понял причину того , что Вы в своем приложении (win tweaker) используете Thread , для выполнения задач в фоновом режиме . Почему не те же самые таски ? Ведь ту задачу можно было так же поместить в таск , перехватит событие закрытия формы , после чего свернуть приложение , к примеру в трей, и спокойно дожидаться когда оно завершит свою работу. Могу ошибаться , но те же майкросовт - тренеры советуют использовать TPL вместо работы с потоками напрямую.
Эээ неее.
Task будет держать основной поток, как ни крути, а нужно, чтобы приложение точно закрылось, если оно фактически по требованию пользователя должно закрыться. При этом, утилита для сжатия файлов должна работать. Она, к слову, штатная, поэтому всё по фен-шую 👍