Ответы пользователя по тегу C#
  • Как ограничить консольное приложение не блокировать базу данных?

    @basrach
    Квантировать. Также как и делает операционная система с процессами. Процессов много, а центральный процессор один. ОС просто даёт маленький интервал времени каждому процессу, все выполняются по очереди и все счастливы.
    Самый простой способ - разбить весь массив на пачки по 100 (10, 1000), между обработкой пачки делать тупо Thread.Sleep(300 или меньше), давая тем самым обработать запросы серверу. Параметры подобрать экспериментально.
    Ответ написан
  • Как обфусцировать код в dll?

    @basrach
    при декомпиляции выдавало ошибку

    Это невозможно. IL, который содержится в .dll, за исключениям синтаксического сахара, практически 1 в 1 соответствует языковым конструкциям C#. В IL сохраняется практически вся необходимая информация об исходном коде. И это не спроста - она нужна CRL, иначе рантайм не сможет выполнить код.
    Можно только до некоторой степени затруднить реверс инжиниринг, запутав поток выполнения, или заменив все имена классов, методов и т.д на рандомные строки. Но спасет это только от школьников, для достаточно квалифицированного специалиста это прибавит час-два работы и всего.
    Ответ написан
  • Зачем оператор new в C#?

    @basrach
    Оператор new создаёт экземпляр типа.

    В данном случае тип (класс) Random. Чтобы создать объект (т.е. экземпляр) этого типа, нужно к этому типу применить оператор new.
    Вызов конструктора и инициализация полей объекта происходит после создания экземпляра. C# позволяет при создании экземпляра типа указать "функцию" - конструктор (у типа их может быть несколько) - чтобы инициализировать созданный объект сразу же после создания.

    Зачем вообще нужен экземпляр типа? Опять же на примере вашего кода - вы хотите использовать метод Next для получения следующего случайного числа. Алгоритм расчета псевдослучайного числа всегда работает с использованием какого-то начального значения, при создании экземпляра типа это значение инициализируется и хранится в конкретно этом экземпляре типа.

    Ссылки по теме.
    https://docs.microsoft.com/en-us/dotnet/csharp/lan...
    https://docs.microsoft.com/en-us/dotnet/csharp/lan...
    Ответ написан
  • Как через LINQ вывести из базы данных вместо Id имя пользователя?

    @basrach
    Я не проверял, но должно быть как-то так:
    var transactionList =
    		from transaction in _context.Transactions
    		from destinationUser in _context.Users
    		from destinationUserWallet in destinationUser.Wallets where destinationUserWallet.Id == transaction.DestinationWalletId
    		from sourceUser in _context.Users
    		from sourceUserWallet in sourceUser.Wallets where sourceUserWallet.Id == transaction.SourceWalletId		
    		where destinationUser.Id == User || sourceUser.Id == User
    		select new 
    		{ 
    			sourceUserName = sourceUser.Name, 
    			destinationUserName	= destinationUser.Name, 
    			transaction
    		};
    Ответ написан
  • C#. Свой прокси сервер с авторизацией. Есть ли простые решения?

    @basrach
    А зачем вам здесь C#?
    Достаточно будет взять nginx и указать ему в качестве upstream "user:pass@host:port".
    Ответ написан
  • Что лучше для работы с файлами QT или C#?

    @basrach
    > Что лучше для работы с файлами
    Лучше то, в чем у вас больше опыта, и на чем написано большинство "рядом работающих" проектов. Если всё остальное написано на Qt, то определенно не стоит писать чтение файлов на C#, и наоборот.

    > В чем может быть причина?
    Причина может быть в кривой реализации на C#. Чтение файлов в любом языке полагается на механизмы ОС, разницы в 6 раз быть не может если измерять только чтение как таковое. Либо вы мерили что-то не то, либо одно из двух.

    > Перечислите пожалуйста достоинства и недостатки обоих.
    Является ли достоинством или недостатком та или иная фича зависит от того, с какой точки зрения посмотреть.
    Ответ написан
  • Что означает данная строка?

    @basrach
    Строка static ConvertedString(); означает объявление статического конструктора. По всей видимости он пустой, либо определен где-то еще (если такое возможно в C++\CLI).

    Строки:
    private:
          ConvertedString(const wchar_t const * data, int ActualLength) :
          char_data(data),
          length(ActualLength)
          {
             ...
          }

    Обычный конструктор с модификатором доступа private
    Ответ написан
  • Как преобразовать в linq?

    @basrach
    public int[,] GetIntValue(ValueClass[,] values)
    {
    	return values.Cast<ValueClass>()
    		.Select((x, i) => new { x?.Value, i })
    		.Aggregate(
    			new int[values.GetLength(0), values.GetLength(1)],
    			(accum, item) =>
    			{
    				accum[item.i / values.GetLength(1), item.i % values.GetLength(1)] = item.Value.GetValueOrDefault();
    				return accum;
    			});
    }
    Ответ написан
  • Почему не работает Property injection в ASP.NET Core MVC через Autofac?

    @basrach
    .RegisterType().As().PropertiesAutowired()

    Этим самым вы сказали, что хотите чтобы Autofac, при создании экземпляра класса Lol произвел инъекцию во всего его (объекта Lol) публичные свойства. Чтобы работал ваш пример, нужно сделать тоже самое но для типа UniversityController.
    А вообще лучше не использовать инъекцию через свойства. Никогда.
    Ответ написан
  • LINQ to SQL и Enum?

    @basrach
    'Edm.Int32'

    Очевидно что стандартный enum невозможно конвертировать в какой-то там 'Edm.Int32'. Об этом среда вам и говорит. Если вообще проблема в этой строке.
    Но так как объявления классов вы не привели, вполне может быть что и SomeProperty имеет у вас этот странный тип, в который linq не может автоматом замапить значение из БД.


    Вспомнил, edm = Entity Data Model.
    У вас какая-то древняя версия EF? Похоже на баг ранних версия EF. Попробуйте заменить
    Error = ErrorLine.None
    на
    Error = (ErrorLine)1 // то значение, которое имеет None
    Ответ написан
  • Как запустить Task на определённое время?

    @basrach
    string serverName = null;
    	var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(30));
    	Task.Run(() => serverName = Server.GetServerName(), cancellationTokenSource.Token);


    В таком случае вызов Server.GetServerName() будет происходить в фоне и не заблокирует основной поток. Теоретически через 30 секунд задача будет отменена. Но по факту задача будет висеть в режиме ожидание ответа по сети до тех пор, пока ответ не придет, и только после того как придет ответ будет выбран свободный поток из пула, который возьмет эту задачу для продолжения выполнения и возможно прервет её, но возможно что и не прервет.

    Если вам гарантированно нужно чтобы задача не выполнилась после истечения 30 секунд, то нужно переделать метод GetServerName() следующим образом:
    public string GetServerName(CancellationToken cancellationToken)
    {
    	// здесь непосредственно вызов по сети
    	
    	cancellationToken.ThrowIfCancellationRequested();
    }

    либо:
    public string GetServerName(CancellationToken cancellationToken)
    {
    	// здесь непосредственно вызов по сети
    
    	if (cancellationToken.IsCancellationRequested)
    	{
    		return;
    	}
    }

    ну и соответственно его вызов будет выглядеть в таком случае вот так:
    Server.GetServerName(cancellationTokenSource.Token)
    Ответ написан
  • Как маппить пакеты по opcode?

    @basrach
    Профессионалами реализуется через switch-case - наиболее понятный для тех кто будет поддерживать и эффективный способ. В качестве же упражнения, либо если вы работаете не в команде, можно попробовать через кодогенерацию, reflection и что еще в голову придет.
    Ответ написан
  • Почему не работает UPDATE c#?

    @basrach
    prodBrand = brandUsers.brand

    просто строка, нужно либо string.Format(), либо интерполяцию использовать, либо параметры команды (что лучше всего)
    Ответ написан
  • Использование Nhibernate и Entity framework в одном проекте?

    @basrach
    Уживутся. Подводных камней нет, кроме того что сами можете временами путаться что у вас через EF, а что через Nhibernate.
    Ответ написан
  • Как можно записать String в Int с автоматическим упрощением?

    @basrach
    Если то, что вводит пользователь соответствует грамматике языка C#, то ставите nuget пакет Microsoft.CodeAnalysis.Scripting и дальше просто:
    var userInput = "3*3";
    var result = await CSharpScript.EvaluateAsync<int>(userInput);
    Console.WriteLine(result); // 9
    Ответ написан
  • C# Request.Content.ReadAsByteArrayAsync().GetAwaiter().GetResult() можно ли вызвать два раза подряд на одном Request?

    @basrach
    По факту эти методы перечитывают поток. В данном случае "поток" чисто абстракция, а данные на самом деле лежат в памяти. В принципе, если вызвать ReadAsStreamAsync на Response.Content, прочитать этот поток и закрыть его, а затем еще раз попытаться прочитать, то тоже будет исключение. В дот.нет конкретно эти два метода реализованы так, что они не закрывают поток после использования, а читают каждый раз его сначала.
    Допустимо ли это? С чисто технической стороны, если это работает, то почему бы и нет. А не с технической нужно руководствоваться принципом наименьшего удивления.
    Ответ написан
  • Identity asp.net core?

    @basrach
    Вахтершу.
    А так, да. Identity де факто стандарт.
    Ответ написан
  • Если ли готовое решение перевода с big endian в little endian?

    @basrach
    Готовое и простое решение навряд ли найдете. Потому что перевод зависит от семантики данных. Условно говоря, то что будет переводить должно понимать где у вас значение из двух байт, где из восьми, а где из одного. Это одна из тех задач, которую будет быстрее и проще разобраться и решить самому, чем потратить кучу времени на поиск и неудачные пробы готовых решений. Написать можно и на C, и на PHP, и на JS.
    Ответ написан
  • C# Как освобождать оперативную память завершенных Task'ов?

    @basrach
    Сам Task, это класс с ~10 полями по 4 байта. Можно посчитать сколько займут в памяти 2000 штук. Очевидно проблема не в них. Как выше уже отметили, проблема не в самих тасках как таковых, а в том коде, который исполняется посредством тасков. И даже не в потоках. Попробуйте создать 2000 настоящих потоков (new System.Threading.Thread(...)) и выполнить там тривиальный код, навряд ли они смогут выжрать 10GB памяти.
    Проблема в коде, который вы запускаете в этих тасках. Если вы не знакомы с автоматическими сброщиками мусора, то нужно про них почитать.
    Любой код на C# - это плюс/минус метод. Создавая таск вы передаете ему ссылку на метод, который нужно выполнять, метод может быть именованным либо анонимным, неважно. Проблема в том, что по завершении этого метода, ресурсы, которые были использованы в этом методе не освобождаются. Неважно где исполняется метод: в таске, в потоке, просто так в основном потоке приложения. Вам нужно добиться того, чтобы при выходе из метода, которые вы передаете таску, все ресурсы использованные в этом методе были освобождены.
    Если вы незнакомы со сборщиком мусора в CLR, то почитайте обязательно, да и вообще про сборку мусора.
    В данном же ситуации, не видя кода, могу только посоветовать следующее. Далее для упрощения понимания будем считать, что у нас всего два участка кода: некий метод (это то что вы передаете в таск), и основной поток (вся остальная программа):
    1) Если что-то создаете (вообще везде, а в методе особенно), любой класс, если у него есть метод .Close() или Dispose(), то обязательно вызывайте этот метод после того как класс вам больше не нужен.
    2) Если есть возврат результата из метода, проверьте не возвращается ли сверх того, что вам нужно. Например, возвращается класс, с двумя полями, одно число, другое массив. Вам нужно из этого только число. Соответственно, поле с массивом нужно убрать из возвращаемого значения.
    3) Упростите возвращаемый результат насколько это возможно. Например вам нужно подсчитать сумму элементов в N массивах. Вы запускаете N потоков и возвращаете N массивов, т.е. из каждого метода по массиву, а потом в основном потоке суммируете длины всех массивов. В этом случае как раз будет ощущение утечки памяти. Нужно возвращать сразу длину массива. И т.д.
    4) Если есть добавление элементов из метода в коллекцию, которая объявлена в основном потоке. Проверить, очищается ли эта коллекция при выходе из метода. Или не добавляется и слишком много в эту коллекцию. Или Возможно в эту коллекцию добавляются слишком большие массивы и т.п.
    5) Почти то же что и предыдущий пункт. Если есть какая-либо статическая коллекция или статические поля, переделайте на нестатические везде где возможно. А где невозможно, проследите чтобы в такую статическую коллекцию не добавлялись элементы из метода. Или если добавляются, то проверьте размер элементов, он должен быть минимальный.
    6) Проследите, что не создаете больших массивов размером более 80кб. Если создаете, Измените на меньший размер если возможно. Например, если стоит задача подсчитать количество символов в файле, то не нужно читать его в память. Достаточно в цикле считывать по 8кб и суммировать результат.
    7) Последнее. Перед выходом из метода вставьте:
    System.Runtime.GCSettings.LargeObjectHeapCompactionMode = System.Runtime.GCLargeObjectHeapCompactionMode.CompactOnce;
    System.GC.Collect();
    Ответ написан