1. C# / Говнокод #9868

    +110

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    public class CatalogCache : IDIsposable
    {
        public void Dispose()
        {
            if (_loadThread != null)
            {
                if (_loadThread.IsAlive)
                    _loadThread.Abort();
            }
    
            if (_updateThread != null)
            {
                if (_updateThread.IsAlive)
                    _updateThread.Abort();
            }
    }

    Запостил: abatishchev, 05 Апреля 2012

    Комментарии (24) RSS

    • и опять без LINQ
      додиезники такие ламеры...
      Ответить
      • Специально для тебя:
        new[] { loadThread, updateThread  }
            .Where(t => t != null && t.IsAlive)
            .AsParallel()
            .ForEach(t => t.Abort());
        Ответить
        • LINQ, LINQ... В той же Scala это выглядит примерно также:
          Array(loadThread, updateThread).filter(t => t != null && t.isAlive).foreach(_.stop())
          Ответить
        • >.AsParallel()
          ILOLD
          Ответить
          • Породим два потока чтобы грохнуть два потока
            а то двое на одного не честно
            Ответить
          • Я об таком бездумном использовании .AsParallel() уже говорил.
            И пояснял на пальцах, почему оно обычно совсем не нужно.

            >Породим два потока чтобы грохнуть два потока
            Так это ж многопоточно! И быстрей в джва раза!!!
            Ответить
    • В этом вашем .NET делать аборты тоже считается дурным тоном?
      в java это называется Thread.stop() и давным давно задепрекейчено
      Ответить
      • аборт треда на диспоузе класса - я думаю да
        Ответить
        • аборт треда вообще (а вдруг у него там файлы открытые)
          у нас хорошим тоном считается примерно такая организация задачи для потока при ручной имплементации:
          while(!currentThread().isInterrupted() && hasThingsToDo()) {
              doTheStuff();
          }
          cleanUp();
          Однако даже так сейчас мало кто пишет, ведь есть Executors framework.
          Ответить
          • у додиезников хорошим тоном считается если компилируется и если дали MVP
            Ответить
          • >Executors framework
            Охеренно спроектированная вещь.
            На мой взгляд java.util.concurent одна из самых удобных вещей, что есть по дефолту в яве.
            Ответить
    • А кто первый заметит, что одной } не хватает?
      Ответить
      • Да судя по IDIsposable, по крайней мере часть кода набита руками.

        Другой вопрос, а как правильно? Ну, если поток сделан, как выше показано, то задать условие для завершения и дальше Join.
        Не хватает _loadThread = null; , т.к. Dispose может вызваться и дважды.
        Другой момент, что ведь в Dispose нельзя обращаться к объектам, они ведь могут быть уже подчищены сборщиком мусора.
        Ответить
        • > Другой момент, что ведь в Dispose нельзя обращаться к объектам, они ведь могут быть уже подчищены сборщиком мусора.

          ЧОЧО пока объектом кто-то владее, уборщик его не трогает
          Ответить
          • GC может собирать целые "острова" объектов, ссылающихся друг на друга
            Ответить
          • "Э, уборщик, пошёл отсюда, не трогай мои объекты!"
            Ответить
    • > if (_updateThread.IsAlive)
      > _updateThread.Abort();
      жертва аборта...
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • Нет, главное к подружкам своим, таким же потаскушкам, она меня не ревновала, к проституткам каких иногда приводил прямо домой, в те дни, когда она была «занята» тоже, а тут, к матери родной ревнует!
      Ответить

    Добавить комментарий