C# programming. Lesson 19. Multithreading. Part 1

Поділитися
Вставка
  • Опубліковано 2 лют 2025

КОМЕНТАРІ • 104

  • @СофияСолнцева-й7щ
    @СофияСолнцева-й7щ 10 років тому +22

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

  • @10nly0ne1
    @10nly0ne1 6 років тому +14

    7:31 Thread
    12:41 Invoke
    19:31 SynchronizationContext

  • @SULTANVIDEOGAMES
    @SULTANVIDEOGAMES 6 років тому +2

    Это лучший видеоурок по потокам.

  • @arkadiyshuvaev
    @arkadiyshuvaev 7 років тому +12

    Просто отличный урок.
    Кстати, всем, кто найдет это видео уже спустя много лет после публикации (2014). Обратите внимание на комментарий Джона Скита (Aug 18 '15 at 11:22) к своему же ответу: stackoverflow.com/questions/13429129/task-vs-thread-differences?answertab=active#tab-top
    Т.е. сейчас (в наши дни) рекомендовано использование Task.Run.

  • @dloplb
    @dloplb 6 років тому

    отличный канал, организаторы уроков молодцы! искал именно в подробнастях. Спасибо!

  • @НаталияАбргамович
    @НаталияАбргамович 6 років тому

    Очень хорошо - лаконично, ничего лишнего!

  • @Цап-Царап-р8т
    @Цап-Царап-р8т 3 роки тому

    Спасибо огромное! Целый день парился. А тут все по полочкам.

  • @mishalavik4595
    @mishalavik4595 7 років тому

    Спасибо за такие каналы как ваш! Очень полезная информация!

  • @regondaadnoger4028
    @regondaadnoger4028 5 років тому

    С первого раза понял про многопоточность. Браво автор

  • @АндрейЛ-у7в
    @АндрейЛ-у7в 3 роки тому

    Хорошее описание, все четко и по делу!

  • @antonegorov8803
    @antonegorov8803 6 років тому +3

    Спасибо за урок. Познавательно. То что искал. Но осталось пара вопросов, хотя они м.б. были рассмотрены позднее.
    Многопоточность с Invoke.
    Ну как бы вопрос с содержимым кнопки "Отмена" отпал сам собой там и правда только _worker.Cancel();
    Так вот:
    1. Для чего в тексте форме после инициализации строки:
    button1.Click += button1_Click;
    button2.Click += button2_Click;
    ????
    С ними нажатие на кнопку старт запускает сразу два потока. И у многих, как и у меня, возникла проблема с остановкой потока, он и прерывался и продолжал выполняться дальше. Решение Закомментировать или удалить эти строки.
    2. Никто не пробовал закрыть форму (Главный "Красный" поток) до завершения синего, пока ProgressBar не заполниться? Вылетает законное исключение.
    Как отловить это исключение, точнее как остановить Синий вспомогательный поток при остановке главного Красного?

  • @resolution07
    @resolution07 7 років тому

    Как же долго я искал именно такой урок. Спасибо вам большое!!!

  • @natunuarat3207
    @natunuarat3207 9 років тому

    Большое спасибо за урок!
    На моей предыдущей работе все разработчики тоже говорили "шедУлер". Так по-родному звучит ))))

  • @f1sherox
    @f1sherox 10 років тому +1

    Отличный урок. Спасибо.

  • @audesfatum9486
    @audesfatum9486 9 років тому +3

    Спасибо, очень подробно!

  • @L0RDeX
    @L0RDeX 10 років тому +1

    Очень круто! Большое спасибо!

  • @alexanderspiegel6747
    @alexanderspiegel6747 5 років тому

    Браво! Спасибо за урок!

  • @ИгорьСикорский-ц3ы

    Спасибо, понравилось!🙂

  • @denyszorin8675
    @denyszorin8675 9 років тому

    именно то что я искал, спасибо большое !

  • @sashamoroz3569
    @sashamoroz3569 9 років тому

    Спасибо, отличный урок.

  • @Александр-х8ш9з
    @Александр-х8ш9з 8 років тому

    Очень доступно! Спасибо

  • @deretor195
    @deretor195 8 років тому +2

    Насчёт ситуации c прогресбаром в 16:16 : может это происходить из-за того, что к тому моменту когда вылезает окно операции по отрисовке( непосредственно рендерингу) ещё не успели выполниться до конца или не выполнился весь стек команд на отрисовку ?

  • @gydrazine
    @gydrazine 6 років тому +1

    Вспомнился фильм "Охотники за привидениями".) "Нельзя скрещивать потоки!" =)

  • @ТимурАбдулов
    @ТимурАбдулов 9 років тому

    хорошиее видео подробное у вас получаеться все понятно

  • @Andrei-cv1kn
    @Andrei-cv1kn 3 роки тому

    Спасибо!

  • @qazyhn94
    @qazyhn94 9 років тому +6

    вот щас бы про MVC посмотреть)

  • @Rustammv
    @Rustammv 10 років тому

    ASP.NET MVC это вообще интересная тема. так что буду ждать

  • @alexkuzmin9526
    @alexkuzmin9526 4 роки тому

    Ролик отличный, жаль отсутствует ссылка на код. Есть немного неточностей:
    17:00 Добавили строчку " progressBar.Value = progress + 1; ",
    но тогда в цикле при i = 100 условие i

  • @CatWorldson
    @CatWorldson 10 років тому +7

    Круто. Tasks бы с async\await действительно не помешал)

    • @Defazze
      @Defazze  10 років тому +13

      Будет в следующей части )

  • @ОлегКопоть
    @ОлегКопоть 8 років тому +4

    Большой вопрос: нажимая кнопку стоп messageBox выводится, а вот progressBar не останавливается и доходит до конца. Почему так?

  • @AlexanderŁapkowski
    @AlexanderŁapkowski 3 роки тому

    Супер

  • @jefffstone
    @jefffstone 4 роки тому

    Здравствуйте. У меня чёт не работает :)
    Вот как работает эта система: в классе есть функция Work(), которая вызывает Action "ProgressChanged" с параметром, который (Action) в свою очередь связан c функцией worker_ProcessChanged, производящую манипуляции с прогресс баром. И вызывая функцию класса Work() вызывается worker_ProcessChanged через Action.
    Я сделал так же:
    я создал функцию OpNLoad, принимающая на вход OpenFileDialog (он объявлен глобально и определяется по нажатию кнопки). Затем создал Action с тем же типом принимаемого параметра (OpenFileDialog) tryOpen. Далее в нажатии кнопки до определения потока присвоил tryOpen += OpNLoad. Также создал ещё функцию StartLoad, вызывающую Action tryOpen с параметром OpenFileDialog, определённый при нажатии кнопки, и передаю эту функцию (StartLoad) в поток.
    Структурно всё также, как в видео (на 11:35), функция вызывает Action, связанный с другой функцией, и первая функция передаётся в поток, но всё равно ругается на то, что идёт манипуляция с элементом, созданном в другом потоке (ругается всё также на прогресс бар).
    UPD: посмотрел дальше и объявил новый Action, который в теле выполняет действия, затем вызвал это действие через Invoke. На прогресс бар уже не ругается и всё загружает, но всё равно не могу двигать формой в процессе загрузки

  • @Defazze
    @Defazze  10 років тому +19

    Вряд ли. Если что и будет, то ASP.NET MVC

    • @galayko_sergey
      @galayko_sergey 9 років тому +19

      +Defazze Так где же ASP.NET? У вас очень хорошие уроки, с удовольствием смотрел бы серию асп.нет мвс.

    • @lamax847
      @lamax847 6 років тому +4

      может вернетесь с курсом по asp.net Core

    • @HamsterOfBoo
      @HamsterOfBoo 6 років тому

      Оператор лилии Брик

  • @WeAllTheChampions
    @WeAllTheChampions 9 років тому +3

    А какой код в кнопке Stop? (На видео не показано).
    UPDATE: Разобрался, там _worker.Cancel();

    • @bersagiev8233
      @bersagiev8233 5 років тому +1

      у меня все равно не работает , progressBar не останавливается (((

  • @F_elixfelicis
    @F_elixfelicis 7 років тому +1

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

  • @alexg9188
    @alexg9188 10 років тому +1

    Defazze, кол-во просмотров растет. В след видео вставь номер кошелька. С мира по нитке, а тебе приятно.

  • @MsAssassinnn
    @MsAssassinnn 10 років тому

    А будет ли рассмотрен паттерн MVVM, как это было с MVP?

  • @YugoRus
    @YugoRus 8 років тому +2

    Посмотрел видео. Начинающим будет довольно сложно понять. Недостаточно разжевано...
    Вот тут яснее - habrahabr.ru/post/232169/
    Но за видео спасибо! Хорошая работа!

  • @mrspacer1
    @mrspacer1 9 років тому +1

    Поясните, пожалуйста, почему в синхронном коде у нас зависает форма при работе приложения, а при использовании SynchronizationContext не зависает. Ведь в обоих случаях мы используем один поток (красный).
    А еще не понятно зачем нужна проверка InvokeRequired. Что происходит если форма решит что не надо делать Invoke? Мы никогда не попадем в наш метод, но мы же хотим туда попасть!

    • @Defazze
      @Defazze  9 років тому +2

      +Yuriy Smirnov
      1. При синхронном коде приложение занято выполнением рабочей операции, и из-за этого ему "некогда" реагировать на действия пользователя. Отсюда зависание формы.
      2. Обратите внимание: если Invoke не нужен, то операция вызывается, как обычно, не через Invoke. Т.е. значение прогрессбара в любом сценарии будет увеличено.

    • @mrspacer1
      @mrspacer1 9 років тому

      +Программирование - это просто, спасибо за ответы. Вот еще пара вопросов, если можно.
      1. Правильно ли я понимаю, что первый и главный поток это SynchronizationContext который сам запускает поток (второй) для WinForms. Мы передаем наши рабочие операции в главный поток и они выполняются как бы "над потоком" формы.
      Иначе не понятно за счет чего используя SynchronizationContext мы избегаем блокировки.
      Если второго потока нет, то программа выполняется линейно. Доходит до рабочей
      операции и должна "повесить" форму.
      2. Не заметил else, извиняюсь, сглупил. Но так ведь еще хуже: операция вызывается не через invoke, значит должно произойти перекрещивание потоков?!

    • @Defazze
      @Defazze  9 років тому +2

      +Yuriy Smirnov
      1. Главный поток всегда один. Он циклически опрашивает форму, но внутри цикла так же выполняется и рабочий код. Если рабочий код длительный, то естественно что форма "замораживается", потому что главный поток занят выполнением рабочей задачи и опрос формы останавливается. SynchronizationContext - это по сути список делегатов, который тоже находится в этом цикле опроса. Если мы вынесем долгую рабочую операцию в другой поток, а из этого другого потока будем помещать делегаты в этот специальный список, то алгоритм главного потока будет примерно таким:
      а) опросить формы (реакция на действия пользователя, изменение внешнего вида)
      б) выполнить короткий рабочий код, если он есть (длинный то мы вынесли в другой поток)
      в) выполнить делегаты в списке SynchronizationContext (и тут-то происходит изменение прогресс-бара, появление сообщений об окончании работы и т. д.)
      2. Если invoke не нужен, значит, поток один и никакого перекрещивания не происходит )

  • @sexol1235
    @sexol1235 8 років тому

    спасибо, Бро :)

  • @sergeyvasilenko7641
    @sergeyvasilenko7641 4 роки тому

    Суппер, +++

  • @kaptn6218
    @kaptn6218 7 років тому +6

    На WPF метод Invoke(action) следует заменить методом Dispatcher.Invoke(action)
    Проверку можно осуществить через вызов метода Dispatcher.CheckAccess() который проверяет есть ли у вызываемого метода доступ к потоку (или просто CheckAccess() == false)
    Таким образом если доступа нету вызываем метод Dispatcher.Invoke(Action callback):
    if(!CheckAccess())
    Dispatcher.Invoke(action);
    else
    action();

  • @oleg_dnipro
    @oleg_dnipro 9 років тому

    Где бы скачать исходник этого урока?

  • @yuryahafonau8373
    @yuryahafonau8373 10 років тому +3

    молодец

  • @ОлегМартынов-н6г
    @ОлегМартынов-н6г 7 років тому

    спасибо )

  • @pavelchagovskiy6447
    @pavelchagovskiy6447 5 років тому

    Здравствуйте, у меня такая проблема. Когда я закрываю форму, (попробовав в закрытии вызвать метод отмены), то выбрасывается исключение - Доступ к ликвидированному объекту невозможен.
    Имя объекта: "Form1"."
    Как можно с этим бороться? Заранее спасибо. Пробовал окружать Invoke условием if (this.IsDisposed == false)
    {
    this.Invoke(action);
    } Но почему-то не срабатывает

  • @tree-service
    @tree-service 4 роки тому

    то, что надо.

  • @ReasonX3
    @ReasonX3 10 років тому

    Скажите пожалуйста, будет ли разсмотрен вопрос отладки многопоточных приложений?

    • @Defazze
      @Defazze  10 років тому

      не планировал.

    • @РНС_Саакашвили
      @РНС_Саакашвили Рік тому

      @@Defazze не написали код обработчика события нажатия второй кнопки

  • @zurrrrgggg
    @zurrrrgggg 9 років тому +2

    Почему не показали код в баттоне Стоп? Мне лично любопытно как остановить поток.

    • @ValeriySherstiuk
      @ValeriySherstiuk 8 років тому

      private void butStop_Click(object sender, EventArgs e)
      {
      if (_worker != null)
      _worker.Cancell();
      }

  • @sergeyvasilenko7641
    @sergeyvasilenko7641 4 роки тому

    почему то у меня ProgrerssChanged выдает null reference exception

  • @RasFantasy
    @RasFantasy 10 років тому

    А как можно передать сам контрол в обработку метода из под другого потока? например метод public void AddRowsDgw(DataGridView Dgw). У меня не получилось это сделать, но сделал некий велик, внутри потока создаю такой же контрол и потом при выходе метода из копии контрола выдаю данные и свойства во внешний контрол не из потока. Может как нибудь по другому можно обойтись ? )

    • @Defazze
      @Defazze  10 років тому +3

      Не надо создавать контролы не в основном потоке. Это оборачивается гигантским количеством проблем.

  • @TedFanat
    @TedFanat 6 років тому

    Ничего не понял, но очень интересно)

  • @MKoldun
    @MKoldun 7 років тому

    Я не понимаю почему вы на 19:18 пишите this.InvokeEx(action); это же эквивалентно Form1.InvokeEx(action); если я не ошибаюсь. Нам же нужно обращаться к статическому методу класса ControlHelp, тобиш ControlHelp.InvokeEx(this, action);

    • @nameless8332
      @nameless8332 7 років тому

      Потому, что это расширение. Обратите внимание на урок "Три Кита". Где-то во второй половине урока автор расказывает о преимуществе даного подхода.

  • @ivann3135
    @ivann3135 5 років тому

    Лайк.

  • @АлександрСмирнов-ш6щ9э

    Можно проще:
    Invoke((Action)(() => { /* Действия в главном потоке */ }));

  • @janedoe6182
    @janedoe6182 4 роки тому

    "As soon as you type new Thread(), it’s over, your project already has legacy code" - Concurrency in C# Cookbook, By Stephen Cleary.

  • @viruslab1
    @viruslab1 9 років тому +4

    про кнопку стоп то не рассказали ))

  • @ТимурАбдулов
    @ТимурАбдулов 9 років тому +1

    а я на есемблере всего 30 строк вся многопоточность ))) занимает

  • @jsdev195
    @jsdev195 10 років тому +1

    Когда будут новые уроки 7

    • @Defazze
      @Defazze  10 років тому +3

      Сергей Коваль Скоро

  • @gamerecord_online
    @gamerecord_online 9 років тому +6

    извините, а неужели сложно выложить и исходники?

  • @frankgrey6797
    @frankgrey6797 4 роки тому

    По мне так вариант с invoke - очень стрёмное решение с т.з. архитектуры приложения

  • @igor-sukharev
    @igor-sukharev 6 років тому

    Напоминает свёртку в линейной алгебре. (x, f) => f(x), где x in L, f in L*.

  • @A.M.8181
    @A.M.8181 10 років тому

    Плиз выложите на дробокс или гугл драйв примеры.

    • @СофияСолнцева-й7щ
      @СофияСолнцева-й7щ 10 років тому

      Код в примере постоянно эволюционирует - показываются различные в том числе и ошибочные варианты, поэтому конкретного кода для урока здесь иногда не бывает... И в этом уроке почти всё показано, кроме создания объекта _context: SynchronizationContext _context = new SynchronizationContext(); в форме.

    • @Defazze
      @Defazze  10 років тому +1

      София Солнцева как это не показано, 21:33, обработчик MainForm_Load )

    • @СофияСолнцева-й7щ
      @СофияСолнцева-й7щ 10 років тому

      Defazze Не знаю. Может у меня код другой, _context без типа данных - это ведь просто идентификатор. У меня он подсвечивался красным, создал объект с одноименной ссылкой - всё скомпилировалось... Не важно.

    • @samson9438
      @samson9438 7 років тому

      Автор жлобяра, исходник зажал!

  • @СерегаБ-б3н
    @СерегаБ-б3н 2 роки тому

    Станьте моим учителем) по с#

  • @СашаАфанасьев-с3с
    @СашаАфанасьев-с3с 9 років тому

    Ребят как называется библиотека xakep.ru/2010/08/10/52926/ ?

  • @orhanaliyev9774
    @orhanaliyev9774 6 років тому

    У меня не возникло исключения после создания потока))

  • @ДмитрийН-л9ф
    @ДмитрийН-л9ф 7 років тому

    люди, код бросьте в коомент, пожалуйста!

  • @BloodrideWOT
    @BloodrideWOT 5 років тому

    Я один потерял инициализацию _context?

  • @ТимурАбдулов
    @ТимурАбдулов 10 років тому

    а что в C шарп многопоточность есть ? интерестно а в бейсике есть ?

  • @JohnDoe-pg6eh
    @JohnDoe-pg6eh 5 років тому

    срэд

  • @samson9438
    @samson9438 7 років тому

    Автор неужели так сложно выложить исходник?

  • @ВиталийСучков-у9о
    @ВиталийСучков-у9о 6 років тому

    Ни_я непонятно. !!!!

  • @ragnarl.3780
    @ragnarl.3780 5 років тому

    Я один заметил, что перед тем как вызывать событие, его нужно проверить на null? Т.е. что у нас есть подписчики.
    Т.к. если их нет а мы вызовем без проверки, будет исключение. У автора ролика я этого не увидел.

  • @JanryMayers
    @JanryMayers 6 років тому +1

    Дослушал до места "брик".

  • @Abelardinio
    @Abelardinio 10 років тому +3

    Отличный урок. Спасибо. Но произношение у автора английского просто ппц. После того как он скедъюлер назвал шедулером я чуть не умер))

    • @ГеннадийОлейник-ч4в
      @ГеннадийОлейник-ч4в 9 років тому +9

      AbelardoTV шедьюлер - английский вариант, скедьюлер - американский (или наоборот)

  • @РусБ-в
    @РусБ-в 7 років тому +7

    Что за пример для задротов? Нахрена такие сложные примеры, нахрена этот класс в обучении, нахрена усложнять простое. Типичное неадекватное обучение как в школе, интерес пропадает сразу

    • @bohdanvoitovych1574
      @bohdanvoitovych1574 7 років тому +4

      Руслан Баскунов прост уроки не для аутов, что и сказано в описании канала.

    • @orhanaliyev9774
      @orhanaliyev9774 6 років тому +4

      А чо там сложного ?? пара эвентов если смутила так это база без её знания смысл смотреть это видео стремиться к нулю

  • @samson9438
    @samson9438 7 років тому

    форму создал, а дальше переписывать с видео не стал, автор жлобяра, мог бы и поделится исходником!

  • @viktorkatsava595
    @viktorkatsava595 5 років тому

    молодец