1. C++ / Говнокод #14301

    +34

    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
    class cxx_query {
        elements operator()(const std::string &css_query);
        void operator()(std::function<void()> callback);
        http_request get(const std::string &url);
        // ...
    } $;
    
    #define function []
    
    $(function() {
        $.get(some_url, function(const std::string &data) {
            $("#result").html(data);
        });
    });

    Запостил: bormand, 30 Декабря 2013

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

    • Фикс:
      - #define function []
      + #define function [=]
      -     http_request get(const std::string &url);
      +     http_request get(const std::string &url, std::function<void (const std::string &)> callback);
      Ответить
      • Syntax error: std::[=]<void
        Ответить
        • Но дефайн же под классом ;)
          Ответить
          • Зеленый тут лишний.
            Ответить
            • Да так то она права. То еще говнецо, в коде под дефайном нельзя юзать std::function... Потому и зеленым.

              А еще майкрософт когда-то спалился на подобной хрени. Они задефайнили interface как struct в одной из олешных ашек.
              Ответить
              • template<class T>
                using pituxScript = std::function<T>;
                Ответить
              • у них же __interface есть ключевое слово
                Ответить
                • Ну где то тут проскакивало, что и interface тоже задефайнен. Может быть это в старых вижуалках было, а потом одумались и сделали __interface?
                  Ответить
    • Надо еще вариации на тему
      #define var auto
      Ответить
      • #++?
        Ответить
        • Развитие пародии на джаваскрипт же...
          Ответить
          • Я ничего не приемлю кроме шарпа
            Ответить
            • Так вот ты какой, типичный анальный раб майкрософта.
              Ответить
              • Все мы анальные рабы чего то, я выбрал тех, у кого хуец покороче
                Ответить
                • Забыл добавить - и помягче
                  Ответить
                  • https://pp.vk.me/c616816/v616816325/32a2/AT-iTlkYdlY.jpg
                    Ответить
                  • я смотрю ты тоже в теме.

                    Вот на лор зайдите - сразу видно, что у людей здоровая елда в заднице - кричат, кровью харкают, пену ртом пускают....
                    Ответить
                    • А, т.е. кроме майкрософта и линупса ничего нет? :)
                      Ответить
                • > я выбрал тех, у кого хуец покороче
                  Любовь за деньги - это не любовь :)
                  Ответить
              • Зачем так грубо - может у человека дилема Сони Мармеладовой. Вот работа не нравится, а деньги нужны, вот за эти самые шекели и дает себя тряхать, пишет на сисетке.
                Ответить
                • Нет, мне сисетка нравится. Мне вообще .Net нравится. Вот согласитесь, если бы .Net был мультиплатформеным то большая часть жаберов ушла бы на него.
                  Ответить
                  • Был бы у бабушки хуй, была бы она дедушкой.
                    Ответить
                    • Ты считаешь. что я неправ или констатируешь то. что .Net не является мультиплатформеным?
                      Ответить
                      • Констатирую то, что .net не является мультиплатформенным, и никогда им не будет.
                        Ответить
                        • Искренне согласен с этим. MS никогда те будет делать кроссплатворменным то, что помогает продавать сопутствующие товары.
                          Ответить
                      • один наш программист с большим бекграундом на дотнете начал глубоко изучать жабу только этим летом, потому что партия сказала надо (а комсомол ответил "есть")

                        искренне говорит, что жаба гораздо лучше с#
                        Ответить
                        • Я студент, большого опыта работы не имею, и в данный момент C# и VS привлекает меня больше чем java. Возможно это синдром утенка.
                          Ответить
                          • ну дык для жабы есть idea
                            гораздо более многосторонняя среда
                            по крайней мере с js она дружит на порядок лучше, студии до такого уровня как до китая раком

                            равно как и поддерживает ещё миллион других языков
                            Ответить
                            • Java полноценно поддерживает функциональный стиль программирования?
                              Ответить
                              • жаба тупа как валенок
                                эта монета двусторонняя
                                Ответить
                                • Это плюс такой?)

                                  VB тоже туп как валенок
                                  Ответить
                              • жаба 8 умеет в функции высшего порядка и лямбды.
                                А ещё есть скала, до которой этому вашему шарпу как раком до Китая
                                Ответить
                                • даже F#?
                                  Ответить
                                  • даже. фшарпы и прочие окамлы после скалки крайне унылы
                                    Ответить
                                    • На самом деле один хрен большенство программистов юзает один язык на проект, что на jvm что на .Net .

                                      Забавно выглядит описание форм на F#.
                                      Ответить
                                    • скала унылее фшарпика.
                                      не понял чем тебе скала так приглянулась
                                      Ответить
                              • > Java полноценно поддерживает функциональный стиль программирования?
                                Поддерживает, угу. Наелся я уже этих псевдофункциональщиков (http://govnokod.ru/14162), не нужно в жабке фп, дай дуракам yield стеклянный...
                                Ответить
                                • я не такая. Я жду трамвая
                                  Ответить
                                  • а как тебе такая экзотика? http://ceylon-lang.org/documentation/current/
                                    Ответить
                                    • прогроммирование с слономъ.

                                      пей цейлоский чай - программируй на цейлоне
                                      Ответить
                                    • > а как тебе такая экзотика?

                                      Утомило меня всё это. В чём преимущество очередной вундервафли перед существующими вундервафлями? Некоторые даже от скалки уже отказались (http://www.infoq.com/news/2011/11/yammer-scala), ибо часто приходится ломать голову над тривиальными вещами, а производительностью и отзывчивостью программ управлять становится всё труднее.
                                      Зачем мне тратить время на вещи, которыми никто никогда не будет пользоваться? Я не вольный художник @wvxvw, обвиняющий всех в невежестве и тупом копировании уже созданных шедевров, втихушку админящий венду и правящий быдлосайты на кнокауте с мечтами о лишпах. Я - инженер и хочу делать вещи, которые работают, и работают хорошо. Для этого инструменты должны быть простыми, понятными и прозрачными. Иначе код становится илитарным и умирает. Проекты могут жить только тогда, когда существуют люди, способные в них разобраться за разумное время.

                                      А вообще я открыл для себя книжку Robert Love - Linux Kernel Development, лажу по линуксовым сорцам (как завещал нам борманд) и любуюсь красотой тупорылой сишки.

                                      P.S. Беглый обзор цейлона показал, что он практически ничем не лучше хацкеля, разве что наличием вездесущей жабомашины под капотом, но это не только преимущество.
                                      Ответить
                                      • > красотой тупорылой сишки
                                        А ведь все-таки царь в чем-то был прав... :)
                                        Ответить
                                        • > ведь все-таки царь в чем-то был прав
                                          У него были моменты просветов, когда в его бредопотоке школосознания проскакивали достойные мысли, но мне всегда было лень читать его портянки.
                                          Ответить
                                          • > когда в его бредопотоке школосознания проскакивали достойные мысли
                                            Теорема о 100500 обезьян, или как там ее правильно ;)
                                            Ответить
                                            • одна из интерпретаций закона больших чисел)
                                              Ответить
                                      • >>Некоторые даже от скалки уже отказались (http://www.infoq.com/news/2011/11/yammer-scala), ибо часто приходится ломать голову над тривиальными вещами, а производительностью и отзывчивостью программ управлять становится всё труднее.

                                        Это же классика - у меня есть молоток и я все им чиню. нужно забить гвоздь - молоток. Нужно открутить болт - молоток. Нужно склеить вазу - молоток. нужно склеить телку - молоток....

                                        Просто люди видят технологию, шары закатывают и кричат - "мать ее это же скала/ фунциональшина/ ооп".

                                        Может я не понял чего да не о том говорю.

                                        Хаскель под jvm может стать неплохой вещью - многие задачи в контексте лямбда исчислений решаются лаконичнее. Но это не значит, что и VC на нем писать нужно
                                        Ответить
                                        • > Хаскель под jvm может стать неплохой вещью
                                          А зачем хаскелю jvm? Он и так неплохо компилится в нативный код ;)
                                          Ответить
                                          • >>А зачем хаскелю jvm?

                                            А зачем математике физика?)
                                            Ответить
                                        • > Хаскель под jvm может стать неплохой вещью
                                          Jaskell
                                          Ответить
                                          • > Jaskell
                                            Блин, он существует...
                                            Ответить
                                            • >Блин, он существует...
                                              Haskell даже cil умеет генерировать
                                              Ответить
                                            • > Блин, он существует...

                                              Узнал о нём случайно из книжки The Productive Programmer, сам ни разу не использовал.
                                              Ответить
                                        • > склеить телку - молоток....

                                          Ну ты молоток...
                                          Ответить
                                      • > цейлона
                                        Cyton?
                                        Ответить
                                      • > цейлона

                                        https://www.google.ru/search?q=%D1%81%D0%B0%D0%B9%D0%BB%D0%BE%D0%BD&newwindow=1&rls=com.microsoft:en-US:IE-Address&source=lnms&tbm=isch&sa=X&ei=yavKUrq 5Bofj4wSOv4C4Bw&ved=0CAcQ_AUoAQ&biw=1088&bih=506
                                        Ответить
                                      • > ничем не лучше хацкеля
                                        Ну конечно! Как-будто что-то может быть лучше Хаскеля.
                                        Ответить
                        • > жаба гораздо лучше с#
                          О_о. А можно его аргументацию услышать? Ну и сравнивает он только языки, или всю инфраструктуру jvm/.net в целом?
                          Ответить
                          • говорил что устал от сахара и постоянных "улучшений" от фреймворка к фреймворку
                            чем старше человек, тем тупее ему нужен инструмент, чтобы быстро решать поставленные задачи

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

                            также он в свое время наелся asp.net (который не mvc) и прочих дотнетных говнотехнологий - благодаря ему мы в свое время не вступили в ад java server faces
                            Ответить
                            • >>говорил что устал от сахара и постоянных "улучшений" от фреймворка к фреймворку
                              чем старше человек, тем тупее ему нужен инструмент, чтобы быстро решать поставленные задачи

                              Никогда бы не подумал, что это плюс. Никто не запрещает писать без сахара, более того сахар помогает решать повседневные задачи быстрее.
                              Ответить
                              • > Никто не запрещает писать без сахара
                                Проблема тут в том, что читать приходится с сахаром (потому что он кому-то помог решить повседневную задачу быстрее). А при командной работе и поддержке проекта ты читаешь гораздо больше чем пишешь.
                                Ответить
                                • Сахар не ухудшает читаемости. Если человек не может прочитать сахар он просто банально не знает. 10 секундный поиск в гугле или банальная "а че этот кусок делает?"и все ок А если работает команда можно выставить договоренности по стилю кода.
                                  Ответить
                                  • > Сахар не ухудшает читаемости.
                                    Да что вы говорите... Как отличить экстеншн метод от обычного не глядя в подсказку IDE? :)

                                    > 10 секундный поиск в гугле
                                    Ок. Загугли мне 2 кубика сахара:
                                    // 1
                                    c = a ?? b;
                                    // 2
                                    int? x;
                                    Время пошло.

                                    > он просто банально не знает
                                    В том и суть, что для полноценной работы с языком ты должен знать весь сахар, который в нем есть. И тогда нет особого смысла в его неиспользовании.
                                    Ответить
                                    • С = а??b;
                                      с = (a!=null)? a:b;

                                      Int? x - обвертка для метода значения, способная принимать null.

                                      Если это шарп.
                                      Но это я тупо знал)

                                      Сахар не настолько сложен и неудобен, что бы его не знать) Если сахар неудобен и\или сложен для понимания - то это уже соль, и разговор другой.

                                      Хотя тут сказывается мое личное отношение - люблю я сахарок типа рубишного
                                      а ||=b unless c
                                      Ответить
                                      • Фигню написал на автомате

                                        <Тип-значение>? x - обвертка, способная принимать null.
                                        Ответить
                                      • > Int? x - обвертка для метода значения, способная принимать null.
                                        Я в курсе, что T? это nullable<T> :) Я даже загуглил это в свое время. Вот только загуглить это было ой как не просто.

                                        > Сахар не настолько сложен и неудобен, что бы его не знать
                                        Ну и какой тогда смысл брать более сложный язык, и не юзать сахар из него?

                                        Начали с твоей фразы "никто не запрещает писать без сахара". Пришли к противоречию ;) Q.E.D.

                                        > а ||= b unless c
                                        Нравится запоминать приоритеты операторов? :) Мне - нет.
                                        Ответить
                                        • >>Я в курсе :) Я даже загуглил это в свое время. Вот только загуглить это было ой как не просто.

                                          Тут ничего сказать не могу, я прочитал это у Троелсона

                                          > Нравится запоминать приоритеты операторов? :) Мне - нет.

                                          мне все это кажется логичным и элементарным. Ну и никто не мешает писать в лисп стиле)

                                          Подведу итог - сахар - сугубо личное дело каждого. Лично я не считаю сахар недостатком, скорее наоборот (поэтому и полюбил практически бесполезный руби).

                                          И тем не менее нельзя сказать, что жаба лучше шарпа основываясь только на том, что в шарпе больше сахара. Тот же сахар async-await дает большое приимущество на мой взгляд
                                          Ответить
                                          • > async-await
                                            Имхо, имеет смысл только для GUI потока (ну и, возможно, для потоков, обслуживающих сокеты). Так что довольно специфический сахарок.
                                            Ответить
                                            • Почему же, ассинхроность в целом
                                              Ответить
                                              • > Почему же, ассинхроность в целом
                                                А где она нужна, кроме случая с гуем, к которому нельзя лезть из других потоков, и случая с I/O мультиплексором, который делают из-за слишком дорогих потоков? :)
                                                Ответить
                                                • Хм. Так то да.

                                                  Я не правильно выразился

                                                  Тот же сахар async-await дает большое приимущество в решении асинхронных задач на мой взгляд

                                                  Да и либа для паралеллизма в .Net побогаче
                                                  Ответить
                                                  • > решении асинхронных задач
                                                    Что такое асинхронная задача?
                                                    Ответить
                                                    • Задача. в которой некоторые подзадачи необходимо решать асинхронно)

                                                      Я неверно выразился?
                                                      Ответить
                                                      • > необходимо решать асинхронно
                                                        Почему их необходимо решать асинхронно?
                                                        Ответить
                                                        • Необходимо - не то слово - писать можно как хочешь

                                                          Предпочтительно решать их асинхронно, так как это помогает увеличить скорость выполнения за счет максимально эффективного распределение ресурсов и снижения времени простоя
                                                          Ответить
                                                          • > Предпочтительно решать их асинхронно, так как это помогает увеличить скорость выполнения за счет максимально эффективного распределение ресурсов и снижения времени простоя
                                                            Слова не мальчика, но эффективного менеджера...

                                                            Ок, значит мы имеем задачу, которую можно решать эффективней, если исполнять несколько ее подзадач параллельно (например на нескольких ядрах SMP системы). Здесь мы плавно подходим к вопросу, почему "помогает увеличить скорость выполнения" именно идиома async-await (аля сопрограммы)? Для этого следует рассмотреть другие существующие решения, позволяющие распараллелить исполнение кода, и обосрать их описать их недостатки. А не просто сказать "вот серебряная пуля, юзайте".
                                                            Ответить
                                                            • >>Слова не мальчика, но эффективного менеджера...

                                                              Ой, не нужно, я весь красный от гордости

                                                              >>"помогает увеличить скорость выполнения" именно идиома async-await

                                                              Она помогает не скорость исполнения увеличить, а быстро сделать из последовательного кода асинхронный. Не нужно переписывать кучу кода, достаточно пары вставок.
                                                              Ответить
                                                              • > Не нужно переписывать кучу кода, достаточно пары вставок.
                                                                Ок, допустим была у Васи прога, которая листала порнофотки с сетевого диска по нажатию стрелочки. Фотки были в хорошем качестве, сеть была плохая, в итоге фотки менялись довольно медленно, и интерфейс подвисал на время чтения-декодирования (т.к. код был простым и синхронным).

                                                                Вася добавил в код await и вызвал асинхронную загрузку вместо синхронной.

                                                                Вопросы на засыпку:
                                                                - что произойдет, если Вася во время лага будет яростно тыкать стрелочку вправо, не видя никакого эффекта?
                                                                - как Вася поймет, что прога что-то делает, а не просто висит (вспомни загрузку win8, в которой во время получасового chkdsk крутится та же самая вертящаяся херня, что и при нормальной загрузке, и хуй поймешь что там вообще происходит)?
                                                                - достаточно ли Васе добавить пару вставок, или все-таки придется закусить удила и переписать кучу кода?
                                                                Ответить
                                                                • Вопрос в том имеет ли тут вообще смысл вставлять такую асинхронность? Вот если бы у него сеть была быстрая, но при закачке одной картинки грузилась не полностью, имело бы смысл грузить картинки асинхронно. А так - толку никакого.

                                                                  Или я задачу не понял.

                                                                  Даже если мыслить так - задача стала асинхронной, проблемы теперь с гуем. Ололо

                                                                  Без async -await - все тоже самое, плюс асинхронность ручками
                                                                  Ответить
                                                                  • > Вопрос в том имеет ли тут вообще смысл вставлять такую асинхронность?
                                                                    Имеет, как минимум можно прикрутить отмену ну и ось не будет ругаться "эта программа не отвечает".

                                                                    > Вот если бы у него сеть была быстрая, но при закачке одной картинки грузилась не полностью, имело бы смысл грузить картинки асинхронно.
                                                                    prefetch? Ну ок, разумно.

                                                                    > задача стала асинхронной, проблемы теперь с гуем
                                                                    Именно так. async-await не стал для Васи серебрянной пулей.

                                                                    > Без async -await - все тоже самое, плюс асинхронность ручками
                                                                    Суть примера была всего лишь в том, чтобы показать, что "Не нужно переписывать кучу кода, достаточно пары вставок" - ложь, пиздежь и сплошная провокация маркетинговый бред. Существующий синхронный код один хрен придется реинжинирить (даже не рефакторить, а именно реинжинирить, со всеми вытекающими последствиями!), с учетом асинхронности.

                                                                    Ок, значит твой следующий аргумент - с async-await кода писать меньше, чем при других способах? Хорошо. Тогда перечисли, пожалуйста, какие способы ты знаешь помимо async-await (можно в контексте Васиной задачи).
                                                                    Ответить
                                                                    • >>Суть примера была всего лишь в том, чтобы показать, что "Не нужно переписывать кучу кода, достаточно пары вставок" - ложь, пиздежь и сплошная провокация маркетинговый бред. Существующий синхронный код один хрен придется реинжинирить (даже не рефакторить, а именно реинжинирить, со всеми вытекающими последствиями!), с учетом асинхронности.

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

                                                                      Это выглядит так же, будто нельзя сказать, что массив создается одной строкой, хотя при переходе от 100 отдельных переменных к массиву придется менять хуеву тучу кода.

                                                                      ИМХО

                                                                      Способы
                                                                      1. Перейти на разделение загрузки-просмотра.(картинки грузим при нажатии кнопки, можно все сразу, а смотрим -когда загрузилась полностью)
                                                                      2. Пилить код с продолжениями
                                                                      3. Сменить провайдера
                                                                      4. отказаться от порно и завести женщину
                                                                      5. Познать дзен
                                                                      6 Смириться
                                                                      7 ???
                                                                      8 PROFIT!
                                                                      Ответить
                                                                      • > мы вставили пару слов -> код стал асинхронным - > что не так то?)
                                                                        Всего лишь то, что проблем у Васиной проги стало больше, чем до вставки пары слов :) Что означает всего лишь то, что вставки пары слов явно недостаточно, и Васе еще пилить и пилить, и материться на того, кто предложил ему "вставить пару слов".

                                                                        > 1. Перейти на разделение загрузки-просмотра
                                                                        Вася нетерпелив. Он хочет дрочить здесь и сейчас, а не через час, когда все докачается. И он не знает заранее, сколько картинок ему понадобится.

                                                                        > 2. Пилить код с продолжениями
                                                                        Хех, ну и засрали же вам моск эти ребята из M$ и node js... Если думать, что кроме продолжений нет других решений - тогда да, async-await это единственное верное решение :)

                                                                        P.S. Варианты 4-8 рулят :)
                                                                        Ответить
                                                                        • >>Всего лишь то, что проблем у Васиной проги стало больше, чем до вставки пары слов :) Что означает всего лишь то, что вставки пары слов явно недостаточно, и Васе еще пилить и пилить, и материться на того, кто предложил ему "вставить пару слов"

                                                                          Тем неменее главная проблема Васи решена - код асинхронный, ему не пришлось думать, как запилить эту задачу, а все остальное Вася умеет делать)

                                                                          Это не ребята их MS, это я зеленый и неопытный) MS(DN) я вообще не люблю - воду разводят. Пытался найти как узнать, пересекаются ли 2 shape, в итоге только на stackoverflow нашел.

                                                                          Если посоветуете литературу по асинхронщине (да и по продолжениям) - с удовольствием почитаю.)
                                                                          Ответить
                                                                          • >> в итоге только на stackoverflow нашел.
                                                                            Я тоже с этим сталкивался - час, два на свалку, пользы -0. Поэтому и не хожу больше к ним.
                                                                            Ответить
                                                                          • > Тем неменее главная проблема Васи решена - код асинхронный, ему не пришлось думать, как запилить эту задачу, а все остальное Вася умеет делать)
                                                                            Хех, ну тут я соглашусь. Вася так и не узнал о потоках и т.п., а задачу решить смог.

                                                                            Но... Почему мы выбрали для него именно этот способ, а не какой-то еще? Согласись, "давайте поюзаем async-await и все будет заебись, нам даже не надо знать про треды", звучит как реклама... А работа инженера начинается все-таки не в том, чтобы схватить первый попавшийся в рекламном проспекте вариант, а в рассмотрении того, как задачу решали другие люди, какие у этих способов были достоинства и недостатки. Да, он может выбрать именно этот вариант. Но осознанно, а не потому что это круто и все так делают.

                                                                            P.S. А как там у async/await с отменой?
                                                                            Ответить
                                                                            • >>Да, он может выбрать именно этот вариант. Но осознанно, а не потому что это круто и все так делают.

                                                                              Ясно дело. А то как с AssParallel получится

                                                                              Таску же в await суем - соответственно cancellationToken запихиваем и все
                                                                              Ответить
                                                                              • > Таску же в await суем - соответственно cancellationToken запихиваем и все
                                                                                Стандартные асинхронные методы (типа чтения из файла) принимают его? UPD: да, принимают.

                                                                                > Ясно дело.
                                                                                Ну так все-таки. Почему из известных нам способов мы выбираем именно async-await, а не какой-то другой? Меня именно это интересует.
                                                                                Ответить
                                                                                • Ну так мы создаем обьект Task и передаем в него CancellationToken а потом через awit запускаем. все норм.

                                                                                  Ну вот пример когда эффективно

                                                                                  есть у нас код

                                                                                  void task()
                                                                                          {
                                                                                              subTask1();
                                                                                              subTask2();
                                                                                              subTask3();
                                                                                          }

                                                                                  но тут мы поняли, что т2 зависит от т1, а т3 - сферическая в вакууме. поэтому мы можем написать что то типа

                                                                                  void task()
                                                                                          {
                                                                                              subTask12();
                                                                                              subTask3();
                                                                                          }
                                                                                  
                                                                                          async void subTask12()
                                                                                          {
                                                                                             await subTask1();
                                                                                             await subTask2();
                                                                                          }
                                                                                  Ответить
                                                                                  • У async/await есть много нерешенных проблем: например, на уровне предоставления библиотечных АПИ: как представить услуги более чем одному потоку/треду? Если описать выполнение всех зависимых тредов как последовательное, то что делать если непоследний чужой поток/тред упал с ошибкой? Ловить все и... куда его потом? Как узнать нужно ли было остановитьсы ан этой ошибке, или нужно было ее игнорировать?
                                                                                    Другой вопрос: такая схема просто игнорирует возможность дедлоков, т.е. очень просто самого себя наказать вызвав тред вызывающий вызывающего. Нужно вручную разруливать потенциальные возможности дедлоков - а это очень плохо скейлится.
                                                                                    (Флеш тоже использует похожую концепцию, и в нем есть известные грабли, когда в обработчике события addedToStage добавляется элемент на сцену, и событие запускается по новой, попадая в тот же самый обработчик).
                                                                                    Еще негативный момент: фьючерсы по факту одноразовые, мусорщика напрягают.
                                                                                    И еще эта схема плохо работает в ситуации когда ответы на запросы приходят не в ЛИФО порядке, а в "каком-нибудь" - в таком случае мы можем нарваться на АБА проблему, или просто никогда не получить ожидаемого ответа, не смотря на то, что отправитель его честно пошлет (как в ситуации когда пользователь очен быстро что-то печатает а автодополнение появляется со все более заметным опозданием / вообще не в тему).
                                                                                    Ответить
                                                                                  • > Ну вот пример когда эффективно
                                                                                    Я прекрасно понимаю, как работает async/await (хотя в данном примере хватило бы банального future).

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

                                                                                    P.S. await перед вызовом task12 разве не нужен?
                                                                                    Ответить
                                                                                    • Нет, ибо данный метод не ассинхронный, лол)
                                                                                      Я имею в виду метод task. await методы могут быть только внутри async методов
                                                                                      Ответить
                                                                                      • > Нет, ибо данный метод не ассинхронный, лол)
                                                                                        > начинает выполняться т1 - управление выпадает на выход из процедуры и начинает выполнятся т3. когда т1 завершится - начнет выполнятся т2.

                                                                                        Да, сорри, я тупанул, время позднее было. Но тогда subTask1() и subTask2() надо переделать так, чтобы они возвращали future (Task в c#)?
                                                                                        Ответить
                                                                                        • Не важно . что они возвращают - они же не асинхронные сами по себе. Их заворачивают в таск и запускают. Короче рабочий пример ниже

                                                                                          Что есть future?)
                                                                                          Ответить
                                                                                          • Оказалось это оно и есть.

                                                                                            Я слишком псевдокодно описал прошлый пример)
                                                                                            Ответить
                                                                                          • > Что есть future?)
                                                                                            Ололо! Шарпеи юзают future даже не зная, что это такое!

                                                                                            > Я слишком псевдокодно описал прошлый пример)
                                                                                            > Их заворачивают в таск и запускают.
                                                                                            Тогда ок. Меня вот и смутило, что await на обычном методе дернули.
                                                                                            Ответить
                                                                                            • Ну зелен еще я)

                                                                                              Пример нашел, понял как оно работает и забил, не вникал в детали)
                                                                                              Ответить
                                                                                  • > но тут мы поняли, что т2 зависит от т1, а т3 - сферическая в вакууме

                                                                                    Или я туплю, или код делает совсем не это ;) мое понимание - выполнится таск1 на тредпуле, затем таск2 тоже на тредпуле, затем таск3 в главном потокн. Разве нет?
                                                                                    Ответить
                                                                                    • Ответить
                                                                                    • начинает выполняться т1 - управление выпадает на выход из процедуры и начинает выполнятся т3. когда т1 завершится - начнет выполнятся т2.

                                                                                      Этож процедуры, нет возвращаемого значения. Более того, когда основной поток выполнит т3 он дальше пойдет гулять за пределы функции)
                                                                                      Ответить
                                                                                    • короче
                                                                                      using System;
                                                                                      using System.Threading;
                                                                                      using System.Threading.Tasks;
                                                                                      
                                                                                      namespace ConsoleApplication3
                                                                                      {
                                                                                          class Program
                                                                                          {
                                                                                              static void Main(string[] args)
                                                                                              {
                                                                                                  Console.WriteLine(task());
                                                                                                  Console.ReadKey();
                                                                                              }
                                                                                      
                                                                                              static int task()
                                                                                              {
                                                                                                  var i = subTask12();
                                                                                                  // мы вышли покурить - можно и подзаработать - запускаем 
                                                                                                  var g = SubTask(500, "t3");
                                                                                                  return  g+i.Result; // принудительно ждем когда все это кончится
                                                                                              }
                                                                                              private static async Task<int> subTask12()
                                                                                              {
                                                                                                  // запускаем на асинхронное выполнение
                                                                                                  var task1 = Task.Factory.StartNew(() => SubTask(1500, "t1"));
                                                                                                  // и эту туда же
                                                                                                  var task2 = Task.Factory.StartNew(() => SubTask(100, "t2"));
                                                                                                  // необходимо дождаться, когда task2 завершиться - идем курить (в функцию таск) 
                                                                                                  SubTask(await task2, "t4"); // послышался гудок - бросаем халтурку в task, выполняем 
                                                                                                  // а тут как повезет, если task1 еще не пришел - идем опять халтурить в task
                                                                                                  SubTask(await task1, "t5");// ну теперь доделывает окончательно
                                                                                                  return 5;
                                                                                              }
                                                                                              static int SubTask( int time, string name)
                                                                                              {
                                                                                                  Thread.Sleep(time);
                                                                                                  Console.WriteLine(name);
                                                                                                  return time;
                                                                                              }
                                                                                          }
                                                                                      }
                                                                                      Ответить
                                                                                      • > короче
                                                                                        Была бы эта прога гуишной - t4 и t5 повешали бы event dispatching thread (или как там у вас его зовут в шарпе) :P

                                                                                        Но пример годный, показывает удобство async/await.
                                                                                        Ответить
                                                                                        • >>event dispatching thread

                                                                                          Что делает эта штука? Может аналог вспомню

                                                                                          Вообще в гуи я так же делал - такс с вычислениями на await ставил, а основной поток на гуишку падал
                                                                                          Ответить
                                                                                          • > Что делает эта штука? Может аналог вспомню
                                                                                            Ну тред, в котором крутится цикл обработки сообщений от гуя. И который нежелательно вешать всякой херней, т.к. страдает отзывчивость интерфейса.

                                                                                            P.S. Пойду поставлю фреймворк 4.5 на виртуалку, чтобы поразбираться с примером.
                                                                                            P.P.S. Ёбаная срань, обновление версии .NET Framework 4, характеризующееся высокой степенью совместимости не встающее на XP...
                                                                                            Ответить
                                                                                            • Мне кажется в .Net нет доступа к этому потоку. Хотя я никогда и не задавался целью его использовать)
                                                                                              Ответить
                                                                                              • > нет доступа к этому потоку
                                                                                                А мне почему-то кажется, что это именно тот поток, в котором срабатывают все обработчики событий от всяких там кнопочек ;)

                                                                                                P.S. Фреймворк поставил, компилю пример.
                                                                                                Ответить
                                                                                                • Ручками, через csc)

                                                                                                  Про поток - сорри, не понял вопроса. Если просто поток формы - то поток и хрен с ним) А если там за кулисами плавает загадочный поток, который отлавливает события и передает обработку в основой - то вообще хз)
                                                                                                  Ответить
                                                                                                  • > Ручками, через csc)
                                                                                                    Именно так, и файл создавал через блокнотик. Ну не ставить же целую вижуалку ради этого...

                                                                                                    > Если просто поток формы - то поток и хрен с ним)
                                                                                                    Там что, на каждую форму по потоку? :) Да вот не хрен бы с ним. Повиснет - ось подумает, что прога зависла, юзер тоже. Кнопочки не тыкаются, ничего не рисуется...

                                                                                                    Из async/await методов можно лезть к гую?
                                                                                                    Ответить
                                                                                                    • >>Из async/await методов можно лезть к гую?

                                                                                                      как и из любого потока. Это ж просто сахар
                                                                                                      Ответить
                                                                                                      • > как и из любого потока
                                                                                                        А ничего, что фреймворк дает по рукам за попытки потрогать гуй из левых потоков? :)
                                                                                                        Ответить
                                                                                                        • стертор недавно об этом спрашивал

                                                                                                          myFormControl1.Invoke(myFormControl1.myDelegate);
                                                                                                          Ответить
                                                                                                          • > myFormControl1.Invoke(myFormControl1.myD elegate);
                                                                                                            Т.е. в любом коде с async/await я должен делать проброс коллбека в UI тред, как и в обычной многопоточке? :) Но почему все утверждают мне обратное, что можно юзать гуй прямо из тела async метода, если сам async метод изначально был вызван из ui треда? :) Так могу я или не могу писать вот такой простой и понятный код:
                                                                                                            // вызывается при клике по кнопочке "далее"
                                                                                                            public async void OnButton1Click() {
                                                                                                                ImageBox1.Image = await DownloadImage();
                                                                                                            }
                                                                                                            И почему я могу (или не могу) его писать?

                                                                                                            P.S. Лишний раз убедился в том, что шарпеи ничего не понимают даже в своем инструменте. Что уж тут говорить о других языках и парадигмах.
                                                                                                            Ответить
                                                                                                            • Ну а что такого плохого, если инструмент можно применять, до поры до времени или вообще не зная деталей реализации? Это лишь говорит о том, что найдена удачная высокоуровневая абстракция (написал async - и заебись, или "вот в таком случае надо писать async"), которая почти не течет.
                                                                                                              Ответить
                                                                                                              • > Это лишь говорит о том, что найдена удачная высокоуровневая абстракция
                                                                                                                Да тут претензии не столько к абстракции, сколько к ее юзерам. Ну ты посмотри, как они ее юзают: из async метода делают Invoke, т.к. не знают, будет там главный поток или нет... И я не думаю, что только Kegdan так тупанул.

                                                                                                                А с абстракцией ниже по треду разобрались. Действительно, все просто и понятно:
                                                                                                                - если есть контекст синхронизации (гуй, вебсервер, прочая херня, где важно в каком треде будет ответ), то await вернется в тот же тред, откуда был вызван
                                                                                                                - если нет контекста синхронизации (свободный поток, тредпул или ко-ко-консолька), или привязку отключили вручную, то await не будет менять тред, и исполнит продолжение где повезет.

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

                                                                                                                Мне, лично, как-то спокойней кодить, если я знаю все ограничения абстракции. Особенно если их совсем немного, и абстракция почти никогда не течет.
                                                                                                                Ответить
                                                                                                                • Хм? Где я тупанул?
                                                                                                                  Ответить
                                                                                                                • >из async метода делают Invoke,
                                                                                                                  А что тут такого? И откуда берется контекст синхронизации?
                                                                                                                  Ответить
                                                                                                                  • > Хм? Где я тупанул?
                                                                                                                    > А что тут такого?
                                                                                                                    А зачем инвочить, если из тела async метода, вызванного из ui треда, можно дергать методы уя напрямую?

                                                                                                                    > откуда берется контекст синхронизации
                                                                                                                    SynchronizationContext.Current
                                                                                                                    Ответить
                                                                                                                    • >SynchronizationContext.Current
                                                                                                                      Чтоэта?
                                                                                                                      Ответить
                                                                                                                      • > SynchronizationContext.Current
                                                                                                                        Свойство, в котором лежит контекст синхронизации текущего треда ;)

                                                                                                                        Вот кегдан кидал ссылку:
                                                                                                                        http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx


                                                                                                                        P.S. Пля, почему я это рассказываю вам, а не вы мне? Я же шарп последний раз лапал году в 2007 :)
                                                                                                                        Ответить
                                                                                                                        • А я его вообще не лапал, не считая просмотра примеров и чтения книг.

                                                                                                                          Так откуда этот контекст берется-то?
                                                                                                                          Ответить
                                                                                                                          • > Так откуда этот контекст берется-то?
                                                                                                                            Ну вот, в случае с гуем, его создал и положил туда метод Application.Run() (или что-то, что вызвалось из этого Run'а, не суть).

                                                                                                                            После чего async методы, запущенные в ui треде будут отправлять продолжения через этот контекст, а значит они будут исполняться в ui потоке, и все будет заебись.

                                                                                                                            Почитай статью, она короткая.
                                                                                                                            Ответить
                                                                                                                            • И довольно грамотная, с разверткой сахара.

                                                                                                                              Скоро пойдут вопросы что такое параллельное программирование в целом и семафоры в частности)
                                                                                                                              Ответить
                                                                                                                            • А что есть Application.Run()?

                                                                                                                              То есть, создатель треда вешает на него флаг "запускать async только из этого треда"?

                                                                                                                              Ебучая опера, вызывает меню при переключении по alt+shift.
                                                                                                                              Ответить
                                                                                                                              • [STAThread]
                                                                                                                                        static void Main()
                                                                                                                                        {
                                                                                                                                            Application.EnableVisualStyles();
                                                                                                                                            Application.SetCompatibleTextRenderingDefault(false);
                                                                                                                                            Application.Run(new Form1());
                                                                                                                                        }
                                                                                                                                так лучше?
                                                                                                                                Ответить
                                                                                                                                • Что есть [STAThread]? Это типа аннотации явы?
                                                                                                                                  Ответить
                                                                                                                                  • А что есть анотации в яве?)

                                                                                                                                    В шарпе это называется атрибутом - записывает метаданные в код, которые потом можно вытянуть рефлексией. собствеено это классы наследники System.Attribute с атрибутом System.AttributeUsage
                                                                                                                                    Ответить
                                                                                                                                    • > А что есть анотации в яве?)
                                                                                                                                      > записывает метаданные в код, которые потом можно вытянуть рефлексией
                                                                                                                                      Ну вот это самое и есть :)
                                                                                                                                      Ответить
                                                                                                                                      • Как много я оказывается знаю) и анотации и future)
                                                                                                                                        Ответить
                                                                                                                                        • > Как много я оказывается знаю) и анотации и future)
                                                                                                                                          Да зная шарп, ты почти всю жабу уже знаешь ;) Там язык то очень простой. Не сложнее питона. Засада только в дженериках.
                                                                                                                                          Ответить
                                                                                                                                          • >Там язык то очень простой. Не сложнее питона.
                                                                                                                                            Гораздо проще. В питоне все такое динамичненькое. Метапрограммирование же.
                                                                                                                                            Ответить
                                                                                                                                          • Что за засада? В шарпе все просто
                                                                                                                                            Ответить
                                                                                                                                • >>var t = FooAsync();
                                                                                                                                  Дальше не захотелось читать, да и синтаксис не родной.
                                                                                                                                  Ответить
                                                                                                                                  • все, отпало желание шарп учить?)
                                                                                                                                    Ответить
                                                                                                                                    • Для того, чтобы оно отпало, оно должно было сначала появиться.
                                                                                                                                      Хочешь правды - иди в Дельфы [к Оракулу]
                                                                                                                                      Ответить
                                                                                                                              • > создатель треда
                                                                                                                                Скорее все-таки то, что крутится внутри этого треда.

                                                                                                                                > вешает на него флаг "запускать async только из этого треда"?

                                                                                                                                Ну примерно так. Ну там не флаг, а приемник колбеков, но не суть.

                                                                                                                                Идея вот такая: "если в этом треде кто-то сделает await, то, когда то чего ждал await завершится, надо бы вернуть управление именно в этот тред".
                                                                                                                                Ответить
                                                                                                                                • >Скорее все-таки то, что крутится внутри этого треда.
                                                                                                                                  То есть внутри треда вешается этот флаг?
                                                                                                                                  Ответить
                                                                                                                                  • > То есть внутри треда вешается этот флаг?
                                                                                                                                    Ну не флаг, ссылка на объект. Но да. Как я понял, вешается она в thread local storage конкретному треду.
                                                                                                                                    Ответить
                                                                                                                        • Потому что опыт важнее знание конкретной платформы
                                                                                                                          Ответить
                                                                                                                    • А, это. Ну тут да, тупанул.
                                                                                                                      Ответить
                                                                                                              • >>Ну а что такого плохого, если инструмент можно применять, до поры до времени или вообще не зная деталей реализации?

                                                                                                                Все.Очень.Плохо.
                                                                                                                Ответить
                                                                                                  • Кстати, а почему у мелкомягких csc не в path?
                                                                                                    Ответить
                                                                                                    • > почему у мелкомягких csc не в path?
                                                                                                      Потому что csc не один. Который из них добавлять в path?
                                                                                                      Ответить
                                                                                                      • python-2.7
                                                                                                        python-3.3
                                                                                                        Ответить
                                                                                                        • > python-2.7
                                                                                                          > python-3.3
                                                                                                          Ну да, вариант. Х.з.тогда. Может быть просто посчитали, что кому надо - добавит сам. А остальным нинужно.
                                                                                                          Ответить
                                                                                                          • Добавит, и переменует заодно.

                                                                                                            А их как-то програмно можно найти, кроме d:\WINDOWS\Microsoft.NET\Framework\*\csc .exe ?
                                                                                                            Ответить
                                                                                                            • > А их как-то програмно можно найти
                                                                                                              Да там вроде даже апишки в дотнете были для вызова компилера. Я х.з. На этот вопрос пусть дотнетчики отвечают.
                                                                                                              Ответить
                                                                                  • когда я вижу вызов subTask12(), я не могу определить, что здесь будет асинхронная хрень и могу элементарно выстрелить себе в ногу при попытке обратиться к общим данных из разных потоков.

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

                                                                                    Дальше, где выполняется вся эта хрень? На каждый вызов создается отдельный поток? Или в тредпуле? В последнем случае как его регулировать? Можно раскидать обработку на разные тредпулы?

                                                                                    Когда в синтаксический сахар примешивают логику выполнения начинается пиздец
                                                                                    Ответить
                                                                      • А нельзя ли создать 2-3 доп.потока?
                                                                        1 поток главный - держит форму. Загружать его длительными операциями недопустимо.

                                                                        2 поток качает картинки, по мере подгрузки ассигнует их с image
                                                                        3 поток следит за состоянием сети, действиями юзера, правит 2 поток, если что не так, отрубает его. Если я правильно понял поставленную задачу, я бы решил ее так.
                                                                        Ответить
                                                                        • Ну это разделение загрузки - просмотра.
                                                                          Я об этом и писал в 1 пункте.
                                                                          Мы говорим - грузи нам x с сайта.
                                                                          пока грузятся мы наблюдаем на каждой страницы просмотра что то типа "10 секунд до онанизма!" а когда загрузится - смотрим картинку. Можно сделать загрузку по мере просмотра - (добавлять в загрузку текущую и n следующих)
                                                                          Ответить
                                                                        • > Если я правильно понял поставленную задачу, я бы решил ее так.
                                                                          Ну третий поток, имхо, лишний. Первый вполне справится с управлением вторым. Довольно низкоуровнево (но в делфи емнип больше никак), но как один из вариантов решения - ок, имеет право на жизнь.
                                                                          Ответить
                                                                    • Ох вы и нафлудили, лучше бы на форуме это делали.

                                                                      >Суть примера была всего лишь в том, чтобы показать, что "Не нужно переписывать кучу кода, достаточно пары вставок" - ложь, пиздежь и сплошная провокация маркетинговый бред.
                                                                      Суть, в первую очередь - асинхронный код выглядит как синхронный. Да, это корпоративная многозадачность, как в win 3.1 и получаем с ней проблемы win 3.1 - если одна задача не отдает управление, виснут все, что юзают тот же потом. Насколько я знаю, единственная проблема. Взамен избавляемся ото всех проблем многопоточности (если все работает в одном треде, а не в нескольких).
                                                                      Ответить
                                                                      • > если одна задача не отдает управление, виснут все, что юзают тот же потом
                                                                        Ну это даже не проблема async-await. Это, если я не туплю, проблема любых схем с future...
                                                                        Ответить
                                                                      • > избавляемся ото всех проблем многопоточности
                                                                        Ну ок, запускаем пример Kegdan'а, который он кидал выше (с небольшим дополнением - выводится айдишка текущего треда, и таймаут у t3 2000мс):
                                                                        Main thread is 1
                                                                        start t3 on 1
                                                                        start t1 on 3
                                                                        start t2 on 4
                                                                        done t2
                                                                        start t4 on 4
                                                                        done t4
                                                                        done t1
                                                                        start t5 on 3
                                                                        done t3
                                                                        done t5
                                                                        Как видим, даже код внутри async метода исполнялся хуй пойми в каком треде... Привет всем проблемам многопоточности ;)
                                                                        Ответить
                                                                        • Как это у тебя 5 таска завершилась не начавшись?)
                                                                          Ответить
                                                                          • > Как это у тебя 5 таска завершилась не начавшись?)
                                                                            Руками переписывал из виртуалки :) Добавь вывод Thread.CurrentThread.ManagedThreadId да перепроверь сам ;) Там еще по IsThreadPoolThread видно, что 3 и 4 треды работают в пуле.
                                                                            Ответить
                                                                            • Руками?) У никсов такие суровые виртуалки, что не поддерживают разделяемые файлы?))))

                                                                              Поиграйся за одно с
                                                                              System.Threading.Tasks.Parallel.For<TLoc al>(Int32, Int32, ParallelOptions, Func<TLocal>, Func<Int32, ParallelLoopState, TLocal, TLocal>, Action<TLocal>)

                                                                              занятная функция

                                                                              http://msdn.microsoft.com/ru-ru/library/dd783586(v=vs.110).aspx
                                                                              Ответить
                                                                              • > У никсов такие суровые виртуалки, что не поддерживают разделяемые файлы?))))
                                                                                Лениво было в опции виртуалки лезть. Все там есть, и общие файлы, и общий клипборд. Просто виртуалка с семеркой свежеустановленная, совсем не настроенная.

                                                                                > Parallel.For
                                                                                Да здесь то понятно, что будет на разных тредах исполняться.

                                                                                Батхерт у меня от того, что вы все тут утверждали (включая хабровчан), что продолжение async task'а исполняется на том же потоке, где и началось. А на деле оно исполнилось на тредпуле...

                                                                                P.S. В принципе, я понимаю, почему продолжение async метода исполнилось на тредпуле, а не в первом треде. Но подожду ответа шарпеев :)

                                                                                P.P.S. Хоть один шарпей понимает те инструменты, которые использует? Или для вас это всегда магия?
                                                                                Ответить
                                                                                • >>Батхерт у меня от того, что вы все тут утверждали (включая хабровчан), что продолжение async task'а исполняется на том же потоке, где и началось. А на деле оно исполнилось на тредпуле...

                                                                                  А не все ли равно с точки зрения основного потока?)

                                                                                  Да и держать поток не нужно в ожидании, новый на пуле выделил и холера его бей.

                                                                                  Я тут один шарпей. Ты что, ждешь что то умное от студента без опыта коммерческой разработки?)
                                                                                  Ответить
                                                                                  • > Ты что, ждешь что то умное от студента без опыта коммерческой разработки?
                                                                                    Учись, студент. На самом деле я просто веду диалог в форме троллинга (в философии, емнип, есть такой способ ведения диалога, когда один участник опровергает и отрицает все, что произнес второй), чтобы вытянуть из оппонентов полезную инфу и самому разобраться в вопросе ;) Ну и заодно ты сам разберешься в своем инструменте.

                                                                                    > новый на пуле выделил и холера его бей
                                                                                    Куски метода исполняются в хуй пойми каких потоках. Об этом как минимум надо знать, чтобы не залететь на забавные ошибки.

                                                                                    > А не все ли равно с точки зрения основного потока?)
                                                                                    Да вот как бы не все равно. Например к ui или сокету лезть из других потоков неприлично.
                                                                                    Ответить
                                                                                    • >>Об этом как минимум надо знать, чтобы не залететь на забавные ошибки.

                                                                                      ты собрался юзать уникальные свойства потока?)

                                                                                      >>Да вот как бы не все равно. Например к ui или сокету лезть из других потоков неприлично.

                                                                                      Сам вызов таска - уже другой поток. так что юзать все равно не кошерно. Хотя тут я могу ошибаться, и MS подзаморочились (непонятно зачем), но я очень в этом сомневаюсь. По этой же причине я считаю, что нельзя просто брать и вызывать события гуя из асинхронки. ибо здравый смысл
                                                                                      Ответить
                                                                                      • > Сам вызов таска - уже другой поток. так что юзать все равно не кошерно.
                                                                                        Это я понимаю. Поэтому таск стараются писать так, чтобы он, по возможности, никуда не лез.

                                                                                        > ты собрался юзать уникальные свойства потока?)
                                                                                        Я собрался передать в async метод некий объект (например что-то гуёвое), чтобы async метод асинхронно что-то сделал (например выполнил пару тасков), а потом сделал что-то с переданным ему объектом. Эксперимент показал, что куски async метода могут исполняться на каких-попало потоках, что может закончиться неприятностями, если тот объект не потокобезопасный.

                                                                                        > По этой же причине я считаю, что нельзя просто брать и вызывать события гуя из асинхронки. ибо здравый смысл
                                                                                        Но почему все статьи об async/await утверждают обратное? :)

                                                                                        Мое предположение:
                                                                                        - Тело async task'а продолжает исполняться на том треде, где начало, если внутри треда крутится цикл обработки сообщений (например gui тред и ему подобные). Именно так его юзают во всяких там статьях.
                                                                                        - Тело async task'а исполняется на рандомных тредах из пула, если тред запустивший его не имеет цикла обработки сообщений (и поэтому ему никак не могут намекнуть о продолжении async task'а). Это мы видим на приведенном тобой примере.


                                                                                        Но хотелось бы увидеть официальную доку от M$, которая расставит все точки над i в этом вопросе ;)
                                                                                        Ответить
                                                                                        • Проверил специально - дохнет как я и говорил.

                                                                                          >>Эксперимент показал, что куски async метода могут исполняться на каких-попало потоках, что может закончиться неприятностями, если тот объект не потокобезопасный.

                                                                                          можно поставить барьер памяти, если сомневаешься в порядке инструкций.

                                                                                          приведи пример кода, или ссыль дай. только что пробовал вызвать - выдало ошибку - несоответствие потоков. через invoke работает.
                                                                                          Ответить
                                                                                          • > приведи пример кода, или ссыль дай
                                                                                            Ну вот код. Все нормально работает, тело async'а исполняется именно в ui треде: http://pastebin.com/pD8DqZfP. Если тыкнуть в Sync во время работы Async, то видно как продолжение async task'а шедулится в ui тред.
                                                                                            Ответить
                                                                                          • > приведи пример кода
                                                                                            А вот на этом примере http://pastebin.com/pp2PsagE мы видим, как наличие\отсутствие цикла обработки сообщений влияет на тот поток, на котором async task завершит свою работу.

                                                                                            P.S. Но эксперименты экспериментами, а мне хотелось бы спеку, в которой английским по белому написано, при каких условиях async task'и ведут себя так, а в каких сяк.
                                                                                            Ответить
                                                                                            • Короче как то так. У формы есть контекст синхронизации (по которому она и определяет, как работать с контролами). При создании потока контекст синхронизации изменяется и приходится вызывать через прыжок из трусов, НО await сохраняет контекст. Поэтому можно вызывать прямо их ассинхронной задачи напрямую. А у меня не получалось изза i.Result вместо await i - из-за этого контекст менялся.

                                                                                              ссыль такая например
                                                                                              http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx
                                                                                              Ответить
                                                                                              • > http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx
                                                                                                Спасибо! Вот такого ответа я и ждал :) Все просто и понятно.

                                                                                                > await сохраняет контекст
                                                                                                Скажем так, пытается сохранить контекст. И если не получилось (как в нашем консольном примере) - то не получилось, ничего не поделаешь.

                                                                                                > Поэтому можно вызывать прямо их ассинхронной задачи напрямую.
                                                                                                Но только если асинхронная задача была запущена из правильного синхроконтекста (например из обработчика нажатия какой-нибудь кнопы). Если ее запустить из жопы (например из таска, исполняющегося на тредпуле) - то нельзя, ибо получим корейский рандом.

                                                                                                > При создании потока контекст синхронизации изменяется
                                                                                                Ну неправда же ;) Вот Application.Run действительно изменяет контекст у текущего треда: устанавливает на входе и зануляет на выходе. А запуск нового треда, а уж тем более отправка таска в него, никак не повлияют на синхроконтекст текущего треда.
                                                                                                Ответить
                                                                                                • >>Ну неправда же ;)

                                                                                                  Даже спорить не буду - я с нашей вчерашней беседы еще не спал, поэтому мозг мне рисует картины дивной красоты, да и читал я основную часть с русского источника)

                                                                                                  Спасибо за вопросы - сам бы я еще долго до этого не добрался)
                                                                                                  Ответить
                                                                                                  • > Спасибо за вопросы - сам бы я еще долго до этого не добрался)
                                                                                                    И тебе спасибо за диалог. Все-таки разобрались до конца в магии этого async-await'а ;) Теперь я даже смогу его юзать, если, конечно, решусь засесть за шарп.
                                                                                                    Ответить
                                                                                                    • Ну я его и так юзал, без знаний контекста синхронизации - просто писал обращение через invoke и все очень мило работало)

                                                                                                      понравился сахарок?

                                                                                                      Ссылка была годная?
                                                                                                      Ответить
                                                                                                      • > Ссылка была годная?
                                                                                                        Да, статья очень годная. Разжевали все вопросы шедулинга, даже показали как свой синхроконтекст для ко-ко-консолечки запилить, если захочется.

                                                                                                        > понравился сахарок?
                                                                                                        Вполне годно, с учетом сохранения контекста синхронизации. Без него не понравился бы.
                                                                                                        Ответить
                                                                                                        • Буду вкушать.)

                                                                                                          Мне кажется я не прочувствовал всей сути это сахара)
                                                                                                          Ответить
                                                                                                          • Блин, хотел just for lulz описать концепт async/await на жабе, с помощью аннотации @async, обычного метода в качестве await и какой-то матери трансформации байткода в конечный автомат, по аналогии с тем, что делает шарповский async...

                                                                                                            Но оказалось, что эта наркомания уже написана: https://github.com/kilim/kilim
                                                                                                            Ответить
                                                                                                            • Напиши на perl)
                                                                                                              Ответить
                                                                                                              • > Напиши на perl)
                                                                                                                Мне кажется, что в спеке perl6 это всяко есть ;)
                                                                                                                Ответить
                                                                                                                • В нем есть все, даже исходники вселенной)
                                                                                                                  но
                                                                                                                  TMTOWTDI )
                                                                                                                  Ответить
                                                                                  • > от студента без опыта коммерческой разработки
                                                                                    Кстати, очень печально, но зачастую даже программисты с опытом коммерческой разработки не понимают того, что происходит в их коде (чему как раз способствуют сложные сахарные языки и библиотеки с кучей магии) :) Так что ничего личного, не обижайся.
                                                                                    Ответить
                                                                            • using System;
                                                                              using System.Linq;
                                                                              using System.Threading;
                                                                              using System.Threading.Tasks;
                                                                              namespace ConsoleApplication16
                                                                              {
                                                                                  class Program
                                                                                  {
                                                                                      private static int[] _treadsId;
                                                                                      static void Main(string[] args)
                                                                                      {
                                                                                          var count = 300;
                                                                                          _treadsId = new int[count];
                                                                                          Parallel.For(0, count, () => new Random(),  
                                                                                                                  (i, pls, rand) => SomeAction(i, rand), 
                                                                                                                  (rand) => { });
                                                                                          Console.WriteLine("Количество потоков - " + _treadsId.GroupBy((x) => x).Count());
                                                                                          Console.ReadKey();
                                                                                      }
                                                                                      private static Random SomeAction(int i, Random rand)
                                                                                      {
                                                                                          Thread.Sleep(rand.Next(200));
                                                                                          var id = Thread.CurrentThread.ManagedThreadId;
                                                                                          Console.WriteLine("поток " + id);
                                                                                          _treadsId[i] = id;
                                                                                          return rand;
                                                                                      }
                                                                                  }
                                                                              }
                                                                              Ответить
                                                                        • > всем проблемам многопоточности
                                                                          а разве должно было быть иначе?

                                                                          в бусте с асио и стеклесс корутинами можно было играться в эти async-await reenter-yield-fork ещё в 2009 в с++03
                                                                          Ответить
                                                                          • > а разве должно было быть иначе?
                                                                            Ну мне тут утверждали, что async-await в пару строчек решит все мои проблемы с асинхронностью и многопоточностью... А я, дурак, даже поверил им...
                                                                            Ответить
                                                                            • Ну это я по аналогии с питоном подсказал, где на самом деле почти один тред :) В сишарпе значит по другому.
                                                                              Ответить
                                                                • >>Вопросы на засыпку: (см. все вопросы)
                                                                  +1
                                                                  >>"Не нужно переписывать кучу кода, достаточно пары вставок" - ложь, пиздежь и сплошная провокация
                                                                  +1 (уже успел набить шишки)
                                                                  Использование асинхронности может принести массу проблем, если не предпринять мер. Опасность в том, что прога не фильтрует сообщения главного потока - можно обращаться к объекту из цикла, и тут же вызвать деструктор объекта...
                                                                  Ответить
                                                              • "Асинхронное выполнение" само по себе очень размытое понятие. Чтобы вообще было понятно о чем идет речь нужно уточнять на что делается упор: одни данные обрабатывает множество разных процедур или одна процедура применяется одновременно к множеству данных. Несвязанные данные обрабатываются разными функциями? (алгоритмов которые хорошо параллелятся последним способом пренебрежительно мало).
                                                                Дальше, нужно указывать как общаются параллельно выполняющиеся программы, они опять же могут либо обмениваться сообщениями, либо работать с общей памятью; у того и у другого подходов есть свои разновидности.

                                                                "Асинхронное выполнение" в стиле ноды характерно тем, что оно если и эффективно чем-то, так это тем, что заставляет писать в духе, когда коротенькие процедуры быстро возвращают управление (но это в свою очередь значит, что параллелизм типа "разные данные + разные функции" - и никакого серьезного профита от этого не ожидается за исключением поверхностных изменений (можно одновременно что-то делать и прогресс-бар нарисовать).

                                                                А вот переписывать синхронный код в асинхронный таким образом плохо. Как правило таким образом переведенные алгоритмы работают примерно так же, как звучит руководство по эксплуатации к китайскому электрочайнику "легко" переведенное на русский "простой" заменой нескольких слов.
                                                                Ответить
                                                    • В моем понимании - любая событийно-ориентированная задача (в первую очередь io включая сеть).
                                                      Ответить
                                                • А что, мало чтоли? Посмотри, как жаваскриптоёбы мучаются.
                                                  Ответить
                                      • >с = (a!=null)? a:b;
                                        А че? Охуенно.

                                        Главное не скатиться до уровня перла.
                                        Ответить
                                • Именно так. Но в Яве тоже есть аннотации, которые добавляют попоболи при отладке. А еще в Яве все люто ненавидят писать на Яве, и стремятся все написать на икс-им-ели, что еще больше усложняет отладку и понимание происходящего в проекте. А еще в Яве нельзя просто взять и указать нужный тип, нужно всегда указывать интерфейс, чтобы поиск исходников в среде разработки не казался таким простым.
                                  Просто эти вещи приходят с опытом. А по-наивности можно случайно и конкретный тип указать, и вместо всяких @Data, @Setter, @Getter + 100500 строк икс-им-еля просто назначить значение полю класса.
                                  Ответить
                                  • > поиск исходников в среде
                                    мда, емакс не только бесполезен в проектах С++, но и даже с тупой жабой не совладал?
                                    > xml
                                    на моей памяти лезть руками в xml нужно было только для работы maven (мерзость, но даже в idea не полноценная поддержка)
                                    Ответить
                                    • > maven
                                      Ant хуже. maven (по крайней мере, на типовых конфигурациях) декларативный и не такой уж и страшный - просто список модулей и зависимостей. А вот ant...

                                      P.S. [оффтоп]Кто-нибудь описывал модули с JNI в maven'е? Сильно сложно?[/оффтоп]
                                      Ответить
                                    • Любой веб на Яве сводится к ХМЛ настройкам какого-нибуд сервера + фреймворка. Этот ХМЛ нужно часто редактировать. Как правило, если что-то случается, то этот хмл - первый подозреваемый.

                                      ХЗ. Эмакс + кланг = нормальный автокомплит, даже в больших проектах, но я много не пользовался. Ява и Эмакс разошлись примерно сразу же после версии Явы 1.1. С Явой ассоциируется массовый приток в отрасль новичков, которые про Эмакс ничего не знали, и начали свой жизненный путь с клипса в виндовсе. А предыдущим пользователям Эмакса Ява вообще не уперлась. Так вот ее поддержкой никто и не занимался.
                                      Я сейчас пользуюсь эклимом: безголовый эклипс используется для дополнения / поиска / импортов / управления проектами, но с нормальным интерфейсом. Работает стабильно, но медленно. Отладчик в консоли, но при сноровке, есть и свои плюсы, типа нормального поиска по сообщениям из логгера, история, отладчик физически находистя в одном окне с кодом, так что не нужно переключаться между программами, чтобы что-то отредактировать, доступны некоторые команды, которые не доступны из графической оболочки (восновном всякая статистика).
                                      Ответить
                                      • настройки какого-нибудь сервера к жабе отношение имеет очень опосредованное

                                        даже если речь идет про Кота Анатолия

                                        ну а фреймворк - ну вот у нас спринг-мвц, и, так сказать, хибернейт (на самом деле там скорее спринговый JPA)

                                        все делается аннотациями, в xml нужды нет
                                        Ответить
                                        • $ find . -name \*.xml -exec grep -e 'http://www.springframework.org/schema/beans' {} +

                                          Чет мне сильно сомнительно, что ничего не отыщится.
                                          Ответить
                                      • > Любой веб на Яве сводится к ХМЛ настройкам какого-нибуд сервера + фреймворка. Этот ХМЛ нужно часто редактировать. Как правило, если что-то случается, то этот хмл - первый подозреваемый.

                                        К сожалению в ASP.NET дела обстоят ничуть не лучше. Вспоминаю те баттхерты, когда разрабы портанули одну из подсистем под фреймворк 4.0, а корень сайта по прежнему крутился под 2.0... Было очень весело. Я тогда узнал много нового о web.config'ах и их наследовании ;)
                                        Ответить
                                        • > К сожалению в ASP.NET дела обстоят ничуть не лучше.
                                          Кстати, а нет в конфиге возможности приказать IISу использовать его для всей папки, а не только для *.aspx?
                                          Например, альтернативные страницы ошибок HTTP работают только для *.aspx; forms authentication закрывает только *.aspx. Хочется прописать в конфиге максимум информации, чтобы на сервере только добавить папку с сайтом и проделать минимум операций для его успешного запуска.
                                          Ответить
                                          • > Кстати, а нет в конфиге возможности приказать IISу использовать его для всей папки, а не только для *.aspx?

                                            Как-то так, через StaticFileHandler? http://stackoverflow.com/questions/11973459/aspnet-static-file-access-with-authentication
                                            Ответить
                                            • Спасибо! Попробую познакомиться с этим поближе. Только "Repeat this process for any other file types you want handled by the ASP.net runtime." не очень радует.
                                              Ответить
                                              • > Repeat this process for any other file types you want handled by the ASP.net runtime.
                                                Ну может быть *.* прокатит, если не заденет *.aspx? У меня сейчас, слава богу, нет под рукой сервера с asp.net.
                                                Ответить
                                                • > Ну может быть *.* прокатит, если не заденет *.aspx?
                                                  Видел я примерно то окно в IISе - там был длиннющий список расширений. Но надежда есть.

                                                  > У меня сейчас, слава богу, нет под рукой сервера с asp.net.
                                                  Выходные ещё :) мне только IIS Express доступен.
                                                  Ответить
                                      • >безголовый эклипс
                                        Ну зачем же так.
                                        Ответить
                                        • > Ну зачем же так.
                                          Безголовый скорее всего headless. Т.е., видимо, чисто ядро эклипса, без гуя.
                                          Ответить
                                  • > аннотации, которые добавляют попоболи при отладке
                                    Это да. Причем аннотации сами по себе не делают ровным счетом ничего. И надо еще догадаться, считает ли ее какая-то либа в рантайме, обработает ли ее какой-нибудь процессор аннотаций, или вообще все положат на нее большой и толстый хуй...

                                    > стремятся все написать на икс-им-ели
                                    Слава богу, с выходом аннотаций, народ перекинулся с XML'я на них... Все-таки небольшая аннотация для тех же ORM'ов выглядит меньшим злом, чем то же самое в виде 10 нод XML...

                                    > нужно всегда указывать интерфейс
                                    И не забыть запилить фабрику билдеров для реализаций этого интерфейса ;) А вообще, интерфейсы это палка о двух концах. С одной стороны это Истинная Инкапсуляция, которая дает очень и очень неплохую развязку, вплоть до свободной замены одной реализации на другую. С другой стороны это Глубокая Задница, т.к. поменять интерфейс уже нереально (уберешь метод - сломаются юзеры, добавишь метод - сломаются реализации), и начинаются костыли в духе попыток каста этого интерфейса в другой...
                                    Ответить
                            • >> искренне говорит, что жаба гораздо лучше с#
                              >> переход на жабу он сделал с огромным воодушевлением
                              Вы ему хотя бы молочко за вредность не выделяете? :) Мне это напоминает симптомы фанатизма, без которого не получится приспособить моск под новое мышление.
                              Ответить
                              • молочко выделяем, 6%

                                программисту вообще тяжко без молочка

                                на самом деле прожекты у нас как раз веб, thin server architecture

                                после довлеющего пиздеца с aspnet/webforms в дотнетах, делать изначально правильно на жабе воодушевляет
                                Ответить
                                • Ну здорово, еще раз неявно убеждаюсь, что шарпик не подходит ни для чего, кроме мелких внутренних утилит с формочками или без них
                                  Ответить
                                  • Еще раз убеждаюсь, что iPhone OS не подходит ни для чего, кроме звонков.
                                    Ответить
                                    • >> Еще раз убеждаюсь, что iPhone не подходит ни для чего, кроме звонков.
                                      Неправда, как обладатель люмии, я утверждаю, что windows phone не подходит ни для чего, кроме звонков, а iphone не подходит ни для чего вообще и это утверждение - результат наблюдений за знакомыми яблочниками.
                                      Ответить
                                      • Это был пример подмены понятий.

                                        Так же как подменили "жаба гораздо лучше с#"

                                        на "Something на java гораздо лучше ASP.NET на C#"
                                        Ответить
                                    • > ни для чего, кроме звонков
                                      Более того, телефоны с Android, Windows Phone (или как там ее сейчас правильно называют) и iOS для звонков менее удобны, чем их кнопочные предки ;) Просто с этим все смирились.
                                      Ответить
                                      • > для звонков менее удобны
                                        Расшифрую:
                                        - Ухом можно скинуть трубку. На современных сотиках для этого приделали детектор уха. На многих старых сотиках с ведром 2.х их не было, и очень доставляли маты коллеги, у которого был как раз такой телефон ;)
                                        - Очень сложно сбросить вызов, не доставая телефон из кармана. На кнопочных моторолке с380 и нокии n73 я делал это с первого раза, даже если телефон был во внутреннем кармане.
                                        - Набирать чей-то номер зимой на ветру - сущий ад (если не покупать специальные токопроводящие варежки).
                                        - Набирать цифры и искать людей в справочнике с этой 4" лопатой одной рукой не очень удобно. На кнопочниках такой проблемы не было.
                                        Ответить
                                        • ++
                                          сейчас все в погоне за видом гейфона и нет ни одного нормального смарта с кнопками.

                                          Эх была же htc с шиндошс mobile с сенсорным экраном и нормальными кнопками, с помощью которых можно было не юзать тачскрин
                                          Ответить
                                        • >Набирать чей-то номер зимой на ветру - сущий ад
                                          Типа ты дохуя в перчатках по маленьким клавишам попадешь. Я всегда снимал перчатки.

                                          >Набирать чей-то номер зимой на ветру - сущий ад
                                          А почему просто не блочить ввод?
                                          Ответить
                                          • > Типа ты дохуя в перчатках по маленьким клавишам попадешь.
                                            Попадал же, вполне так попадал ;) И даже джойстик на n73 умудрялся шатать.

                                            > А почему просто не блочить ввод?
                                            Это про детектор уха? Ну там и блочится ввод, если фотоэлемент почует, что его кто-то заслонил. А совсем блочить нельзя, как скидывать трубку то?
                                            Ответить
                                            • > скидывать
                                              об стену, вестимо
                                              Ответить
                                              • > об стену, вестимо
                                                [на правах рекламы]Хайскрин, сука, крепкий оказался. Пару раз ронял его почти с полутора метров (вешал куртку держа в руках телефон) - аккумулятор вылетал, но корпус целый, экран целый, все работает.[/на правах рекламы]

                                                Так что способ вполне юзабельный ;)
                                                Ответить
                                                • [подкину нищебродства]я давеча прикупил lenovo p780
                                                  хожу троллю айфоногнусмасоводов неделей работы без подзарядки на двух симках[/подкину нищебродства]
                                                  Ответить
                                                • >> Хайскрин, сука, крепкий оказался.
                                                  [не_реклама шиндовс_фон="говно"]Я демонстировал коллегам, насколько крепкий экран у люмии 920, роняя его на разные поверхности экраном вниз где-то с полутра метров. Люмия сдалась в пятом раунде линолеуму: потрескалось стекло, но дисплей и сенсор остались рабочими :)[/не_реклама]
                                                  Ответить
                                                  • > роняя его на разные поверхности
                                                    Эту страну действительно не победить.
                                                    Ответить
                                                  • > насколько крепкий экран у люмии 920
                                                    Стекло Гориллы? Так оно не царапается, но довольно хрупкое ;)
                                                    Ответить
                                                    • хрупкое - понятие растяжимое. большенство случайных падений такое стекло выдерживает.
                                                      Ответить
                                                      • > большенство случайных падений такое стекло выдерживает.
                                                        Потому что обычно он сначала ударяется корпусом (уголком или ребром), а потом уже стеклом, и корпус демпфирует удар. Я думаю хватит одного падения стеклом вниз на какой-нибудь бугорок ;)
                                                        Ответить
                                                        • >> корпус демпфирует удар

                                                          Физик - кун)

                                                          >>Я думаю хватит одного падения стеклом вниз на какой-нибудь бугорок ;)

                                                          с 1,7-1,8м - вряд ли. нужна заостренная поверхность, бугорка мало
                                                          Ответить
                                            • Вешать трубку? Разблокировать и вешать.
                                              Ответить
                                              • > Разблокировать и вешать.
                                                Чем разблокировать? Там из хардварных кнопок громкость да питание ;) Все остальные кнопы на ведрах - выпирающий вниз кусок экранного сенсора. Ну на айфунах, правда, кнопка home (или как там ее), не сенсорная.
                                                Ответить
                                                • Я имел в виду не совсем отключать сенсор, а блокировать как блокируется клавиатура. Надо - разблокировал.
                                                  Ответить
                                                  • > Надо - разблокировал.
                                                    Сбрасывать вызов в духе slide to unlock? Ну да, в этом что-то есть. Но датчик уха все-таки удобней.
                                                    Ответить
                • > дает себя тряхать
                  Если вас собираются изнасиловать - просто расслабьтесь и получайте удовольствие.
                  Ответить
    • class cxx_query { /*...*/ } $;
      Но... Ведь доллар... Идентификатор...
      http://ideone.com/AvtLrp
      О, сколько нам открытий чудных...
      Ответить
      • > Но... Ведь доллар... Идентификатор...
        http://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html
        for (int $a = 0; $a < 10; $a++)
        Ответить
      • В библиотеке для какой-то непопулярной ОС (кажется, VMS) знаки доллара в именах функций были нормой.
        Ответить
    • $(function() {
          $.get(some_url, function(const std::string &data) {
              $("#result").html(data);
          });
      });

      Казалось, причем бы здесь jquery.
      Ответить
    • Раз такая солянка пошла - народ, с чего лучше начать изучение .Net с хуё-моё знанием жавы?
      Ответить
      • а ведь твой альтерэго постоянно поносил жабу с хуёмоё знанием сисярпа
        π подтвердит
        Ответить
      • с запила какой нибудь фигни на нем.
        Ответить
        • > какой нибудь фигни
          распознавание образов, работа с HTTP, конфигами и ASP.NET, т.е. бот-минураст с авторегером и веб-интерфейсом.
          Ответить
          • и не забудь решарпер поставить - с ним на 20% круче
            Ответить
            • +20 к харизме, +6 к урону
              Ответить
              • +100% к удобству написания кода

                Ну и плюс 2 см к члену, Анонимб, это прикинь, для тебя это в 2 раза, в целых 2 раза...
                Ответить
          • >работа с HTTP
            Сервер или клиент? Если клиент - хуле там делать, если сервер - чем оно лучше питона (на котором веб я тоже не знаю)?
            Ответить
            • WCF, мой друг, WCF
              Ответить
            • Да я не на полном серьёзе писал про бота-минураста, тут kegdan лучше знает.
              Ответить
            • вот тебе задачка - напиши удобный вьюер для коментов говнокода
              Ответить
            • Просто пошли их на хуй. Серьезно, если надумаешь учить, давай вместе напишем что-нибудь сетевое.
              Ответить
              • Так что - клиент или сервер?
                Ответить
                • Клиента, клиента, батюшка, непременно клиента!
                  Работа с сетью предполагает многопоточность. Слать/принимать запросы и извлекать инфу из заголовков я умею, а многопоточности не разумею. Таким образом, ты изучишь запросы, а я потоки. Улавливаешь мою мысль? Мы оба останемся в выйгрыше ;)
                  Ответить
                • Вы, парни, знаете что такое WCF?
                  Ответить
                  • Гуй?
                    Ответить
                    • Это фреймверк для обмена данными в .NET. Позволяет писать наколеночные распределенные системы
                      Ответить
                      • > наколеночные распределенные системы
                        Как написать распределенную отказоустойчивую систему за 24 часа.
                        Ответить
                      • В чем прикол переходить на сисярп, чтобы писать ынтырпрайз?
                        Ответить
        • По какой книжке/мануалу его лучше учить?
          Ответить
          • Троелсон, есесно
            Ответить
            • А чем он лучше Рихтера "CLR via C#"? //любопытство
              Ответить
              • тем, что человеку нужно ознакомиться с темой. Сначала троелсон - потом рихтер
                Ответить
                • Так ведь анонимб написал, что уже знаком с джавой, может быть, имеет смысл сразу включить режим "хардкор"? :)
                  Ответить
                  • >>Раз такая солянка пошла - народ, с чего лучше начать изучение .Net с хуё-моё знанием жавы?

                    отъебитесь от меня, ничего не знаю я)
                    Ответить
                  • Они же не на 100% похожи, плюс я в гуе шарю слабо.
                    Ответить
              • А еще есть неплохая квартетная C# 5.0 и платформа .NET 4.5 для профессионалов
                Ответить

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