Ответы пользователя по тегу .NET
  • Как укротить GC, резервирующего память "про запас"?

    Nipheris
    @Nipheris Куратор тега C#
    На самом же деле память, реально используемая приложением остается без изменений.

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

    Еще более абсурдное суждение. Кто говорит, что перерисовка не приводит к созданию объектов? Как насчёт объектов Graphics?
    как можно избавиться от резервируемой памяти "про запас"

    Могу ошибаться, но я никогда не слышал о резервировании памяти "про запас". Видимо, объекты все-таки создаются.
    мне надо чтобы приложение не ело лишней памяти ну или ело, но эта память со временем не увеличивалась (при каждом вызове Invalidate).

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

    Еще проверьте, что у вас не утекают IDisposable объекты. Можете повызывать GC.Collect, но это само по себе временное решение.
    Ответ написан
    3 комментария
  • Как синхронизировать данные на сайте ASP.NET и в локальной базе приложения?

    Посмотрите Change Data Capture.

    А вообще, почему требование именно в синхронизации? Может, стоит смотреть в одну и ту же базу в обоих случаях?
    Ответ написан
    6 комментариев
  • Как писать тесты в asp.net mvc не затрагивая Entity Framework?

    Nipheris
    @Nipheris Куратор тега C#
    Как мокать EF не используя не нужный слой абстракции с репозиторями таким образом чтобы весь функционал EF оставался рабочим?

    Может, не такой он уж он не нужный? Репозиторий нужен в том числе для того, чтобы иметь четкий список методов для тестирования. Я сейчас вообще не могу толком понять, что вы тестируете.
    Ответ написан
    Комментировать
  • Какие существуют архитектуры взаимодействия с базой данных?

    А вы по какому признаку хотите классифицировать? Я вот могу назвать такую архитектуру клиент-серверной, а еще многослойной.
    Какие альтернативы? Ну, во-первых сам WCF может быть очень разный, и SOAP, и REST. Во-вторых, некоторые клиенты (например, административного характера) могут цепляться напрямую к базе (к примеру, они имеют доступ к серверу по VPN), и тогда веб-сервиса между БД и клиентом нет.
    Также, приложение может работать не сразу со веб-сервисом/БД, а к примеру складировать данные в локальную базу (какой-нибудь SQLite), а потом её синхронизировать с основной БД - также через сервис или напрямую (зависит от доверия к клиентскому приложению) - это сложнее с точки зрения наладки всего процесса, но иногда просто необходимо, если связь с центральным сервером БД не гарантирована (иногда приложения на мобильных устройствах должны работать и вне большого города и толстого 4G канала).

    WCF-служба может пользоваться ORM или программист может заранее составить все SQL-запросы.
    WCF-служба может хоститься и на IIS, если это удобно. Хотя, если она выполняет в БД фоновые операции, то вполне правильно и логично хостить её в Виндовом сервисе.

    Каждый из перечисленных вами слоёв можно поменять/убрать/упростить/усложнить. А еще, например, можно вспомнить про многопользовательскую работу и возможные проблемы при работе разных людей с одними и теми же данными, что тоже повлияет почти на все слои в вашей схеме.

    Вас что конкретно интересует? Нужно хотя бы говорить о клиенте или сервисе отдельно, т.к. это сами по себе крупные компоненты со своей архитектурой.
    Ответ написан
  • Как связать две иерархии классов?

    Nipheris
    @Nipheris Куратор тега C#
    Если вы обязаны жить с разделением архитектурных слоёв, о котором вы упомянули и не можете ничего поменять: первый вариант "тип" - "инициализатор" вижу наиболее удобным. Все равно придется добавлять маппинг при добавлении нового типа объекта.
    Вообще можно конечно продолжить извращение и воспользоваться рефлексией и сделать автомаппинг классов "модели" на наследников GameObject. Например, искать все классы "модели" в определенном неймспейсе и искать такие же в другом (которые, в свою очередь, будут наследниками от GameObject).

    Вообще, вы в каком-то смысле идете вразрез с архитектурой самого движка, т.к. GameObject-ы - это не только "представление", а и модель тоже. Я понимаю, что вы наверное не хотите создавать тяжелые GameObject-ы, когда они вроде как не нужны еще (т.е. не в области видимости), но возможно, если не добавлять их в сцену, они не будут нагружать движок.
    В общем, у меня есть сомнения в том, что такое разделение на модель и представление при использовании Unity - хорошая практика.
    Ответ написан
    1 комментарий
  • Как удалить дублируемые слова (и словосочетания) в строке, разделенной запятыми?

    Nipheris
    @Nipheris Куратор тега C#
    ideone.com/4z7HsT

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    public class Test
    {
    	public static void Main()
    	{
    		string text = "енот, енот, гваделупский енот, косумельский енот, енот, енот-полоскун, енот-ракоед, косумельский енот";
    		var result = text.Split(',').Select(x => x.Trim()).Distinct().Aggregate((r, word) => r + ", " + word);
    		Console.WriteLine(result);
    	}
    }
    Ответ написан
    Комментировать
  • Как посчитать до какого значения заполнен массив по каждому из измерений?

    Nipheris
    @Nipheris Куратор тега C#
    И этот массив заполнен некоторыми строковыми значениями, но не полностью, а только до некоторых значений.

    Это предположение неверно. Массив не бывает заполнен частично, до некоторых значений. В массиве всегда есть все значения, просто при создании массива они устанавливаются в дефолтовые.
    Вам нужно хранить ваши значения в структуре переменного размера, например в списке (List).
    Либо, раз уж у вас значения строкового типа, вы можете воспользоваться тем фактом, что строка - это ссылочный тип, и поэтому может иметь значения null. Вы можете идти по элементам массива до первого встретившегося null и считать его первым "незаполенным" элементом, если это подходит для вашей задачи (правда, тогда это придется делать каждый раз заново).
    Ответ написан
    Комментировать
  • Как организовать обработку сообщений от нескольких серверов?

    Nipheris
    @Nipheris Куратор тега C#
    Общая концепция и модель: раз и два.
    Конкретные реализации и протоколы: обмен сообщениями в чистом виде, независимо от платформы: AMQP, ZeroMQ; также, если речь про дотнет, можно попробовать WCF.
    Ответ написан
    4 комментария
  • Версии F# обратно совместимы?

    Любой нормальный поддерживаемый язык сохраняет совместимость на уровне синтаксиса, если не указано иного. Лично я нигде не встречал, что в F# была поломана обратная совместимость, поэтому предположу, что все в порядке. Тем более там изменений было не так уж много, кардинальных не было вообще.

    и почему здесь нет тега F# или F SHARP?

    очевидно, не популярны вопросы по F#. Тут и по C# спрашивают не так часто, как можно подумать.
    Ответ написан
    Комментировать
  • Как правильно спроектировать службу?

    Во-первых вам нужно ОЧЕНЬ ЧЕТКО понять принципиальную разницу между терминами "WCF service" и "windows service", т.к. общего между ними немного. Первое это про веб-сервисы, второе - это тоже что и демоны в *nix-системах. Первое это про архитектуру распределенной системы, второе это про жизненный цикл программы (как, когда и кем запускается/останавливается).

    Поэтому:
    1) если разработка под Винду, и
    "служба должна выполнять в фоне некоторые действия с бд"

    то почитайте про Windows Service - на шарпе такие пишутся относительно просто. Это не единственный способ запустить процесс, который будет крутиться и сам что-то делать в базе, но он предпочтителен.
    2) если взаимодействие с клиентом подразумевается не по самодельному протоколу, а например по HTTP, то вам срочно нужно ознакомиться с тем, что такое веб-сервисы/веб-API и какие они бывают. Если вы уже понимаете что это такое, то вам нужно выбрать способ реализации под Дотнетом.

    Подскажите, это можно сделать в рамках одной службы или нет?

    Если под службой понимается Windows-служба, то можно. Стоит ли - другой вопрос, зависит от тех действий, которые вы хотите выполнять в фоне, архитектуры БД и политики работы с ней.
    Ответ написан
    Комментировать
  • Как лучше привязать WCF приложение к проекту на WPF?

    Nipheris
    @Nipheris Куратор тега C#
    Правильно ли я сделал, что определение класса самого объекта из списка расположил в проекте wcf-сервиса? Класс списка со всеми операциями я расположил там же.

    Зависит от вашего задания. В принципе для такого тестового не вижу смысла заморачиваться разбиением на проекты.

    сейчас я скопировал адрес из wcf-test-client и вставил как service reference в wpf

    Это действие необходимо вам прежде всего для генерации кода клиента. Куда конкретно подключаться насколько я помню, можно указать в конструкторе клиента.
    Ответ написан
    Комментировать
  • Почему не подгружаются в код зависимости NuGet?

    1) проверьте, выполняется ли nuget restore. Вот прям сами откройте packages, зайдите в папки конкретных пакетов и проверьте что там лежат скачанные сборки
    2) к сожалению в классических проектах на C# (не DNX) взаимодействие с NuGet довольно посредственное. В том смысле, что содержимое проекта и packages.config может рассинхронизироваться (ввиду отстутсвия единого списка пакетов/сборок, как это сделали в project.json). Т.е. в packages.config все будет, но в csproj эти ссылки не будут прописаны.
    Выход из ситуации - открыть ручками csproj и поставить нужные Reference, прописав относительные пути на сборки в packages, вроде таких:
    <Reference Include="NetTopologySuite.IO.ShapeFile">
          <HintPath>..\..\packages\NetTopologySuite.IO.1.13.3.2\lib\net40-client\NetTopologySuite.IO.ShapeFile.dll</HintPath>
        </Reference>

    Конкретный путь надо смотреть вам (на сколько уровней "выйти" и в какие папки "зайти"). Сначала нужно, конечно, проверить, нет ли уже этих ссылок - возможно просто папка packages почему-то уехала на новое место, и пути просто испортились.
    Ответ написан
  • Куда развиваться в C#?

    Nipheris
    @Nipheris Куратор тега C#
    с подсветкой синтаксиса

    хм, неплохо если вы его уже реально напишите.

    Собственно, что нужно читать, писать, смотреть, чтобы развиваться?

    Прикладное направление выберите для начала. Стандартный выбор на сегодня: веб-бэкенд/десктоп/игры/мобайл. Соответственно: ASP.NET 5ASP.NET Core 1.0/WPF/Unity/(UWP/Xamarin)
    Ответ написан
    4 комментария
  • Удалить файл из папки Program Files без прав администратора. Возможно ли?

    Nipheris
    @Nipheris Куратор тега C#
    а) создать для сервиса отдельного пользователя и дать ему необходимые права в ФС;
    б) поменять пользователя сервиса на другого, но для этого нужно знать, из под кого он запускается сейчас и почему не хватает прав.

    P.S. Да, что там насчет инсталлера?)
    Ответ написан
  • Для чего нужны свойства зависимости?

    Все предельно просто - dependency properties это попытка получить реактивное программирование конкретно в рамках WPF и с минимальными затратами (без модификаций на уровне языков/платформы .net).

    Вы формулами в Экселе когда-нибудь пользовались? Вида =A1+A2+A3? Когда обновляешь ячейку A1 и автоматически обновляются все значения, вычисляемые по формулам, в которых встречается A1. Вот это примерно то же самое. Почему это так важно в WPF? Потому что а) это естественный способ связи свойств визуальных компонент друг с другом и с ViewModel-ью - без свойств зависимостей обновление зависимых значений превращается в адские цепочки Refresh-ей, Recalc-ов и прочего, и дай бог не забыть вызвать все нужные пересчеты. б) это дает механизм абстрагированной обработки и изменения свойств объектов (как правило - контролов), более производительный и узкоспециализированный по сравнению со стандартной рефлексией. Это, в свою очередь, обеспечивает возможность без лишних заморочек написать классы вроде DoubleAnimation, с помощью которого можно анимировать ЛЮБОЕ (!) свойство типа double у любого объекта, лишь бы оно было dependency property.
    Ответ написан
    Комментировать
  • Как работает C#?

    Nipheris
    @Nipheris Куратор тега C#
    А откуда берётся этот MSIL? Куда компилируются .cs?

    cs компилируются компилятором. Есть стандартный csc, поставляется вместе с .net framework (НЕ со студией). Это "классический" компилятор от MS, написан на C++, с закрытым исходным кодом. Такой же есть и для Visual Basic. Кроме них есть еще Roslyn-компиляторы C# и VB, они open-source, их главное отличие в том, что они сами написаны на управляемых языках. Это значит, что у вас есть compiler-as-a-service. Это, в свою очередь, значит, что если вы хотите написать тулзу, обрабатывающую тем или иным образом исходный код, например на C#, вам не нужно самому писать парсер/компилятор, вы можете подключить модули Roslyn-компилятора и пользоваться ТЕМ ЖЕ компилятором (лексером/парсером/etc), что и используется непосредственно при сборке приложения. С классическим компилятором так не получится, он представляет из себя черный ящик: cs на входе, сборка на выходе.

    Далее будем считать, что не учитываем в рассуждениях технологию .net native.
    в каком моменте тогда работает виртуальная машина

    она работает в момент запуска exe.
    почему мы получаем на выходе .exe

    в этом вопросе часто возникает путаница. Дело в том, что дотнетовские exe и dll - это т.н. сборки (assemblies), и они содержат метаданные и MSIL (!) исполняемый код. То, что у них расширения exe и dll - это потому, что MS для повышения совместимости и удобства использования, упаковала их в формат PE. Чтобы .net приложения можно было запускать также, как и нативные. НО реально в exe-файле есть только небольшой загрузчик, который запускает CLR, просит загрузить текущий файл как дотнет-сборку и передать управление на метод-точку входа. Почитайте про сборки в хорошей книге, и скачайте dotPeek, посмотрите что внутри дотнетовского exe. Это совсем не то, что в "обычном", нативном exe.

    В мире C# существуют также такие понятия как .NET, Mono, Roslyn и т.д., можете ли вы структурированно разъяснить их смысл?

    .NET это название и бренд платформы, .NET Framework, а теперь и .NET Core - реализации платформы от MS, Mono - open-source реализация НЕ от MS. .NET FW работает только на винде, .NET Core и Mono и на других платформах. Про Roslyn уже упомянул.
    Ответ написан
    Комментировать
  • Дерево выражений не может содержать динамическую операцию?

    Nipheris
    @Nipheris Куратор тега C#
    Компилятор жалуется на то, что где-то в ваших лямбдах он столкнулся с dynamic, и разумеется он не может его вкомпилить в expression tree. Скорее всего, p был dynamic, а t - нет. Укажите в вопросе конкретные типы контейнеров, по которым вы делали Find и Where, может ситуация понятнее станет (и заодно, какие интерфейсы они реализуют - IEnumerable<T> или IQueryable<T>).
    Ответ написан
  • Как правльно произвести вызов события из потока?

    Nipheris
    @Nipheris Куратор тега C#
    Когда Б обрабатывает событие, возникает исключение как будто метод класса Б работает в потоке объекта А, это нормально?

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

    Пофиксил через SynchronizationContext, но может быть есть получше варианты?

    Нормальный вариант, если вы используете подсистему, у которой есть реализация SynchronizationContext, например WinForms или WPF. Если же это не ваш вариант, то нужно предоставить свою реализацию, или же отказаться от его использования и явно использовать очереди сообщений для общения между потоками.
    Ответ написан
    Комментировать