Ответы пользователя по тегу .NET
  • В чём отличие многопоточности и асинхронности в контексте .NET C#?

    Nipheris
    @Nipheris Куратор тега C#
    Асинхронность - это способ организации вычислений, когда код, вызывающий какую-либо операцию/подпрограмму /функцию, не дожидается завершения работы этой операции, а если ему интересен результат вычислений, то он получает вместо готового результата некий способ запросить результат позже, когда он будет готов (то, что называется промисом или фьючером или ещё как-то в зависимости от языка). Это по сути противоположность "обычному" синхронному вызову, когда вызывающий код останавливается и ждёт завершения функции, чтобы получить результат. Как это будет достигнуто - это уже другой вопрос, это зависит от сути операции, запускаемой асинхронно.

    Но ведь при классической многопоточности никакой поток так же не блокируется

    Что такое "классическая многопоточность"? Что это за термин? Что такое неклассическая многопоточность?
    Если брать потоки ОС, то операционка просто передаёт управление созданному потоку в желаемую точку входа и дальше уже поток решает что и как делать. Поток может молотить вычисления 10 минут, потом записать их куда-нибудь в файл и завершиться. Никаких кормлений задачами не будет (хотя я не совсем понимаю что такое кормить задачами в вашем контексте).

    Тем более при асинхронности практически всегда подразумевается многопоточность

    С чего бы? Асинхронный код полезен при большом количестве операций ввода-вывода - диск, сеть и т.д. Не обязательно это должно быть что-то, вычисляющееся в отдельном потоке. Вот, почитайте хорошую статью: There is no thread.

    Вам будет полезно ознакомиться с асинхронностью в какой-нибудь изначально однопоточной среде, например JS в браузере не считая вебворкеров. Тогда вы поймёте разницу.
    Ответ написан
    5 комментариев
  • Как найти хост, созданный CreateHostBuilder(args).Build()?

    Nipheris
    @Nipheris Куратор тега C#
    Поразбирайтесь с временем жизни хоста: Manage the host lifetime.

    И попробуйте запустить его с помощью, например, Run.
    Ответ написан
    Комментировать
  • Как сделать авторизацию через AD в веб-приложении?

    Советую прежде чем начать писать свои велосипеды, глянуть сюда:
    https://identityserver4.readthedocs.io/en/latest/
    https://github.com/Nordes/IdentityServer4.LdapExtension

    Ну и вообще, аутентификацию можно выставить и в виде ADFS (или например через Keycloak), но чтобы вам такое советовать, нужно знать ваши масштабы и бизнес-требования.
    Ответ написан
  • Что значит такое ограничение в заголовке класса?

    Nipheris
    @Nipheris Куратор тега C#
    Чтобы в этом ограничении был смысл, класс Game должен быть дженериком с параметром типа TFamilyType.

    Ограничение говорит, что тот тип, который вы подставите вместо TFamilyType при использовании класса Game, должен реализовывать интерфейс IFamily и иметь конструктор без параметров.
    Ответ написан
    1 комментарий
  • С чего лучше начинать VisualBasic или C#?

    Nipheris
    @Nipheris Куратор тега C#
    Да какой VB, о чём вы) Его, при большом желании, можно поучить как второй/третий, если хотите устроиться в конкретную фирму или на конкретную позицию, но учить его первым.. Новый код на нём просто не пишут, это язык легаси. Да, VB в чём-то может и хорош для обучения, но нет, не тратьте сейчас на него время.

    Тут сам C# конкурирует с прочими популярными языками за место под солнцем (пусть и весьма успешно), а вы про Visual Basic :).
    Ответ написан
    Комментировать
  • Как обратиться элементу ключа в словаре?

    Nipheris
    @Nipheris Куратор тега C#
    1. Если речь идёт ТОЛЬКО о ключе, зачем вам знать какой у вас словарь? То ли вы дали лишнюю информацию, то ли спросили не то что хотели на самом деле.
    2. Вопрос сводится к тому, как получить "первый" элемент из KeyValuePair. Это можно сделать с помощью св-ва Key. А вообще почитайте про кортежи (которые встроенные, в круглых скобках), и сделайте по-человечески:
    var a = new Dictionary<(string, string), string>;
    Доступ к первому элементу в этом случае - св-во Item1.
    Ответ написан
  • Как организовать принцип передачи данных между клиентом и сервером?

    Стоит разобраться с RESTful(REST-like) HTTP API как с подходом, который заходит в большем числе типовых задач, и разобраться с OpenAPI, и решатся все ваши проблемы про стандарт и про OSI. А уже потом, если вдруг увидете что RPC поверх какого-нибудь Protocol Buffers вам действительно нужнее - тогда и будете делать

    Вы сейчас находитесь в вакууме относительно используемых технологий клиент-серверного взаимодействия, вам нужно из этого вакуума выходить. Про ту же авторизацию/регистрацию уже столько всего наделано, и протоколов (вроде OpenID Connect) и фреймворков (вроде поддержки в ASP.NET всех типовых сценариев), что аж есть из чего выбрать.
    Ответ написан
    3 комментария
  • Как работает подключение зависимостей с NetCore и NetStandard?

    Вы столкнулись с библиотекой, которая имеет различные версии под разные операционные системы (в нюгете это называется runtimes). Констатировать это можно по наличию папки runtimes в корне nuget-пакета. Та сборка которую вы видите в lib\netstandard2.0 (весов 29 кб) редиректит типы на сборку для конкретного рантайма (ЕМНИП).
    1) Где можно почитать подробно о том, как это работает?

    Начните отсюда: https://natemcmaster.com/blog/2016/05/19/nuget3-ri...
    NetStandard работает как интерфейс и ищет именно сборку на той платформе, на которой запущено приложение?

    Да.
    то как же создать независимую от Nuget сборку

    Что значит независимую от NuGet? В чём вы видите зависимость?
    4) Что будет, если я запущу TestNetCoreApp в профиле другого пользователя, у которого нет скачанных пакетов в ".nuget/packages"?

    https://docs.microsoft.com/en-us/dotnet/core/tools... :
    Starting with .NET Core 2.0, you don't have to run dotnet restore because it's run implicitly by all commands, such as dotnet build and dotnet run, that require a restore to occur.
    Ответ написан
    Комментировать
  • Где найти уроки по созданию приложения под win на C# + .NET?

    Nipheris
    @Nipheris Куратор тега C#
    Не то ищите, разработку на Windows Forms или WPF погуглите.
    Ответ написан
    Комментировать
  • Почему не работает .NET Core 2.1?

    Вы скорее всего увидите .Net Core 2.1 только в Visual Studio 2017 15.7 Preview 1 , почитайте внимательно https://blogs.msdn.microsoft.com/dotnet/2018/04/11...
    Ответ написан
    Комментировать
  • Верно ли утверждение, что если начать писать на С# придётся платить (например IDE, Unity или что-то другое)?

    Nipheris
    @Nipheris Куратор тега C#
    После того как MS многие ключевые компоненты дотнета перевело в опен-сорс (не все конечно, но гораздо лучше чем вообще ничего), платить нужно примерно за то же, что и везде - за продвинутые возможности IDE, которые помогают ВАМ заработать деньги. Если у вас работы больше чем на 5-10 разработчиков, и соотв-но это приносит вам достаточно денег чтобы им платить и себе оставлять, то платить за эти возможности вы будете с удовольствием - всё равно время спецов уж точно дороже.

    А если нет - то оно вам и не надо. В той же Community студии и дебаггер доступен, и уже даже профайлером можно пользоваться. Нет только всяких фишечек удобных когда нужно сэкономить дорогое время или задебажить противные трудновоспроизводимые баги. В любом случае, такого жёсткого vendor-lock как был лет 10 назад, когда с .net framework соперничал только Mono, сейчас уже нет.
    Ответ написан
    Комментировать
  • Class libriry .Net. В чем разница?

    Nipheris
    @Nipheris Куратор тега C#
    1. .Net Framework и .Net Core - различные реализации интерфейсов и спецификаций, которые в народе и называют "дотнетом". Туда же - Mono.
    2.
    В чем разница, какую выбрать и одинаков ли на них код?

    Разница в доступных API. У каждой из реализаций свой набор стандартных классов, где-то больше, где-то меньше. .Net Standard - это как рази таки ОБЩИЙ стандарт доступных API. Будете разрабатывать под .Net Standard - ваша библиотека будет работать на всех реализациях которые его поддерживают. Обратите внимание что версий .Net Standard несколько - чем старше версия тем больше доступных API, но тем больше вероятность что некая версия некой реализации не поддерживает конкретную версию .Net Standard (если нужно подробнее - поищу ссылки).
    3.
    какую выбрать

    Выберете .Net Standard - сможете запустить везде, но не будут доступны API специфичные для конкретной реализации. Выберете .Net Framework - будут доступны все API классического Framework но портируемость может быть потеряна. Выбирайте .Net Standard пока не упрётесь (если вообще упретёсь) в то, что вам нужно API которое есть только в .Net Framework.

    То, что сказал freeExec про Standard не имеет ничего общего с реальностью, C++ и нативные dll тут не при чём.
    Ответ написан
    1 комментарий
  • Как уничтожаются объекты значимых типов?

    Nipheris
    @Nipheris Куратор тега C#
    1. В теории реализация не обязана использовать стек для хранения локальных объектов value-типов (см. https://blogs.msdn.microsoft.com/ericlippert/2009/... ).
    2. Тем не менее, в текущих реализациях используется именно стек, поэтому всё как и в остальных языках: https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D... .
    3. Помните, что значения value-типов иногда (не всегда) хранятся на стеке. Все значения value-типов, являющиеся частью объекта ссылочного типа (например, int-поле в классе или элементы массива double) рождаются и умирают вместе с этим объектом.

    Итого:
    • время жизни локальных объектов value-типов связывается с фреймом стека;
    • время жизни объектов value-типов, находящихся в составе объектов reference-типов, связывается с временем жизни объемлющего объекта;

    Более экзотические ситуации рассматривать не будем. И вообще, как говорит Липперт (см. ссылку), лучше не думать в терминах стека, т.к. это деталь реализации. Лучше говорить о времени жизни относительно вызываемых функций и относительно других объектов.
    Ответ написан
    1 комментарий
  • Какая разница между интерфейсами IEnumerable и IEnumerator?

    Nipheris
    @Nipheris Куратор тега C#
    Та сущность, по которой пробегают, должна реализовывать IEnumerable.
    Та сущность, которая пробегает, должна реализовывать IEnumerator (обычно это вложенный, нередко приватно объявленный класс).

    То что вы сказали я к сожалению не понял.
    Ответ написан
    Комментировать
  • Верно ли понимаю TPL и асинхронность?

    Nipheris
    @Nipheris Куратор тега C#
    1. Да, задача может исполниться где угодно. Более того, вы не поверите, но некоторые таски вообще могут нигде не исполняться, т.к. исполнять нечего (см. п. 5). Таск - это прежде всего абстракция значения, которое будет получено в будущем, и для получения которого возможно нужно что-то посчитать или просто подождать. См. futures and promises.
    2. Ну не обязательно в новом потоке, может быть выполнится и в существующем потоке если в пуле потоков есть свободный.
    3. Асинхронные операции ввода-вывода называются так потому, что выполняются через асинхронное API операционной системы. Нет никакого смысла использовать асинхронную операцию, но делать это в отдельном потоке созданном специально для этой операции. Потоки нужны прежде всего для того, чтобы эффективно нагружать исполнителей, т.е. процессоры (в том числе разные их ядра).
    4. Можно в новом, можно в потоке из пула. Так или иначе, если операция предполагает именно расчёты, а не ожидание ввода/вывода, то безусловно это тот случай, когда имеет смысл переложить нагрузку на другой поток.
    5. Если представлять таск как одну из сторон "трубы", по которой прилетит результат асинхронной операции, то Task - это принимающая сторона, а TaskCompletiotionSource - передающая (производящая результат) сторона. Когда вы создаёте таск из кода который нужно выполнить, этот код становится передающей стороной. Но Task абстрагирует любую асинхронную операцию, не только ту где нужно долго что-то считать. Возможно вам нужно дождаться одного байтика из сети, и операция будет считаться завершенной. Во всех тех случаях, когда вы хотите самостоятельно "произвести" результат для какого-то таска (а сам таск отдать "наружу" другому коду, например вернуть из функции), вы можете использовать TaskCompletionSource.
    (Кстати, в C++ принимающая сторона называется future, а передающая (производящая) - promise. В JS принимающая сторона называется Promise, а передатчиком является функтор).
    Ответ написан
    1 комментарий
  • Как сделать в datagrid (WPF) привязку данных для столбцов, а не строк?

    Можно попытаться последовать этим советам: https://archive.codeplex.com/?p=rotatedwpfdatagrid .
    Ну или отказаться от DataGrid и посмотреть в сторону других контролов.
    Ответ написан
  • Библиотеки для написания Аудио Плеера на C# .NET?

    Nipheris
    @Nipheris Куратор тега C#
    Конечно NAudio (пакет).
    Ответ написан
    Комментировать