Змінюй хід війни! Допомагай ЗСУ!

Интересные вопросы для .NET разработчиков под web

  • Автор теми Автор теми Yaroslav4ik
  • Дата створення Дата створення
О дааа, очень КЛАССНЫЙ код :D своей кривостью напоминает что каждому BeginInvoke нужно вызывать EndInvoke. Заюзаешь его когда будешь девелопить сайт на ASP.NET ;)

И шо ты тут будешь в ЕндИнвоук делать? Проверять, шо на консоль вывелось? (или не вывелось)
И ваще - какая криворукость или пряморукость?? Три левых строчки кода. От *********
 
Останнє редагування:
Конкретно ТУТ ничего, поскольку пример абсолютно непрактичный (хотя EndInvoke-и б дали гарантию того что мы увидим все три меседжа на экране), а вообще асинхронные вызовы Begin... резервируют неуправляемые ресурсы, которые CLR никак не освободит без вызова соответствующего End...

Три левых строчки кода.

Ну почему же, вон Тыемуразу понравилось, в свою коллекцию исходников добавит ;)
 
И ваще - какая криворукость или пряморукость?? Три левых строчки кода. От *********

я вообще-то другое подразумевал - поведение приведенного вами кода недетерминировано. Из него видно что человек его написавший плохо понимает многопоточность, синхронизацию.
Код такого человека:
1) может неделю работать без багов, а потом неожиданно вылезет fatal error
2) может работать хорошо на машине разработчика, но вызывать fatal error на машине клиента
и т.д. и т.п. :)

Поведение такого кода аналогично поведению следующего прикола на C++:
Код:
#define TRUE ((rand() % 100)<98? 1:0)

Инными словами, благодаря такому коду, обнаружить ошибку будет крайне проблематично
 
Да, я недостаточно понимаю многопоточность, но понимаю, что эту "недетерминированность" не исправит ЕндИнвоук.
"поведение приведенного вами кода недетерминировано." - если бы я хотел ,чтобы оно было детерминированно, я бы этого кода не привел. Хотя все же услышал здесь очень адекватный и умный ответ (один)
 
Да, я недостаточно понимаю многопоточность, но понимаю, что эту "недетерминированность" не исправит ЕндИнвоук.

EndInvoke - это уже из другой оперы, иногда можно и не вызывать, все зависит от реализации, только нужно помнить что вызов мог обвалиться с исключением.
 
эту "недетерминированность" не исправит ЕндИнвоук.

Почему? Давай разберемся. Вызов EndInvoke не выполняется в отдельном потоке а приостанавливает основной ожидая пока не выполниться вызов BeginInvoke (т.е. не завершится работа фонового потока). Таким образом процесс не завершится пока EndInvoke не вернет управление основному потоку и тот не выполнит все остальные свои инструкции. В обсуждаемом примере для каждого вызова нужно было бы сохранить результаты вызова BeginInvoke-ов в отдельные переменные и передать их EndInvoke-ам соответственно, тогда бы мы увидели все сообщения. Разве я не прав?
 
ВОПРОС №2
 

Вкладення

  • TryCatchFinally.webp
    TryCatchFinally.webp
    30.9 КБ · Перегляди: 95
Ответ - 1й вариант, т.к. Finally выполниться независимо, потом управление может переходить куда-то еще

Вот еще популярный вопрос по .NET-у. Что будет выведено на экран (если будет выведено вообще)?

Код:
            try
            {
                 //bla-bla-bla
                throw new IOException();
            }
            catch (Exception)
            {
                 Console.WriteLine("Exception is thrown");
            }
            catch (IOException)
            {
                 Console.WriteLine("IOException is thrown");
                //...обрабатываем IOException
            }
 
Вот еще популярный вопрос по .NET-у. Что будет выведено на экран (если будет выведено вообще)?

тут ошибка - первый кэтч перекрывает второй.

Имхо закрытые вопросы мало о чем говорят, куда интересней проверять открытыми формами вопросов, вот мой вариант вопроса :)

MS SQL 2008, имеется к примеру телефонная база, таблица содержит десятки миллионов записей. Имеется простой запрос, например
Код:
SELECT [phone], [owner] FROM [TELECOM] WHERE [owner] LIKE 'A%'

Нужно реализовать paging. Т.е. форма приложения отображает результаты постранично, начиная с указанной страницы, каждая страница должна содержать rowsPerPage строк.

Таким образом на входе имеются:
pageNumber - номер страницы
rowsPerPage - количество строк на страницу

На выходе необходимо получить таблицу из rowsPerPage строк, содержащую страницу pageNumber.

Вопросы - какие возможны способы решения задачи? (писать код не обязательно - описать и объяснить суть) :)
 
MS SQL 2008, имеется к примеру телефонная база, таблица содержит десятки миллионов записей.

Нужно реализовать paging.

Погуглил - в 2008м так и не докрутили чего-то подобного MySQL'евскому LIMIT :( По старинке, в SQL 2000, это решалось через временную таблицу и курсоры, если мне склероз не изменяет. Сейчас, наверное через партиционирование и вложенный запрос проще будет - но на правильность ответа сильно претендовать не буду, SQL запросов не писал года полтора как минимум, а сложных - так и все шесть.
 
Впринципе в большинстве (если не во всех) ASP.NET табличных контролах paging уже реализован, но если задача требует реализовать свой то можно сделать так:
Создать user контрол для представления данных, добавив туда:
1) Табличный контрол, например, ListView
2) Свойства Paging (bool), RowsPerPage (int) и CurrentPage (int)
3) Кнопки Previous / Next
4) События PageNextClicked и PagePrevClicked (отв. за обработку кнопок)
5) Далее можно юзать контрол и создать метод
DataTable UpdateTableViewData(int pageNum)
внутри которого забирать данные с SQL таблицы, делить кол-во записей на RowsPerPage, таким образом получая количество страниц и формируя для соответствующей страницы (pageNum) новый DataTable и возвращая его.
6) Обработать PageNextClicked и PagePrevClicked добавив туда 3 строчки:
CurrentPage++ (или CurrentPage-- для PagePrevClicked)
tblControl.DataSource = UpdateTableViewData(tblControl.CurrentPage)
tblControl.DataBind();

Как-то так. Конечно можно еще подумать над тем как бы инкапсулировать ВСЮ логику внутрь юзер контрола (это было б предподчительней)
 
По-моему, основной момент в этом вопросе - слегка дополнить запрос, чтобы он выбирал только строчки из диапазона [ (page - 1)*rows ... page *rows - 1].

Как-то тревожат меня десятки миллионов записей, с которыми надо работать :) Вдруг они все там на "А"...

Код:
SELECT 
   [phone], 
   [owner], 
   RowNumber() OVER ( ORDERBY [owner] ) AS [RNUM] 
FROM (
   SELECT 
      [phone],
      [owner]
   FROM   
      [TELECOM] 
   WHERE 
      [owner] LIKE 'A%' )
WHERE 
   AND ( RNUM >= ( @page - 1 )*@rowsPerPage ) 
   AND ( RNUM < @page*@rowsPerPage )
 
Назад
Зверху Знизу