Ответы пользователя по тегу .NET
  • Как прикрутить многопоточную обработку без проблем с памятью?

    @cicatrix
    было бы большой ошибкой думать
    Не создавай много потоков.
    Если хочешь заморочиться, то можно отслеживать состояние памяти процесса и регулировать их количество. Если не заморачиваться, то прирост производительности от параллельного исполнения ограничен количеством ядер процессора.
    То, что ты описал, подходит под паттерн - производитель-потребитель.
    Пример реализации
    Ответ написан
  • Как генерировать/перебирать строку в пределах диапазона?

    @cicatrix
    было бы большой ошибкой думать
    А алфавит-то какой? 0-9A-Z, 0-9A-z, 0-9A-F или ещё какой?
    Может 4-й разряд принимать буквенные значения? Для каждого разряда разные алфавиты?

    class ComplexValue
        {
            const string m_Alphabet = "abcdefghijklmnopqrstuvwxyz";
            int First { get; set; }
            char[] Middle { get; set; };
            int Last { get; set; }
            public ComplexValue(string input)
            {
                First = int.Parse(input.Substring(0, 1));
                Middle = input.Substring(1, 3).ToCharArray();
                Last = int.Parse(input.Substring(input.Length - 1, 1));
            }
    
            public string Value() => $"{First}{new string(Middle)}{Last}";
    
            private int IncrementLast()
            {
                Last++;
                if (Last > 9) { Last = 0; return 1; }
                return 0;
            }
    
            private int DecrementLast()
            {
                Last--;
                if (Last < 0) { Last = 9; return 1 }
                return 0;
            }
    
            private char IncrementChar(char c, out bool carry)
            {
                carry = false;
                c++;
                if (c > m_Alphabet[m_Alphabet.Length -1] )
                {
                    c = m_Alphabet[0];
                    carry = true;
                }
                return c;
            }
    
            private char DecrementChar(char c, out bool borrow)
            {
                borrow = false;
                c--;
                if (c < m_Alphabet[0])
                {
                    c = m_Alphabet[m_Alphabet.Length - 1];
                    borrow = true;
                }
                return c;
            }
            
            private int IncrementMiddle()
            {
                int pos = Middle.Length - 1;
                while (pos > 0)
                {
                    Middle[pos] = IncrementChar(Middle[pos], out bool carry);
                    if (!carry) return 0;
                    pos--;
                }
                return 1;
            }
    
            private int DecrementMiddle()
            {
                int pos = Middle.Length - 1;
                while (pos > 0)
                {
                    Middle[pos] = DecrementChar(Middle[pos], out bool borrow);
                    if (!borrow) return 0;
                    pos--;
                }
                return 1;
            }
    
            public void Increment()
            {
                if (IncrementLast() > 0)
                {
                    if (IncrementMiddle() > 0) First++;
                }
            }
    
            public void Decrement()
            {
                if (DecrementLast() > 0)
                {
                    if (DecrementMiddle() > 0) First--;
                }
            }
        }
    Ответ написан
  • Как создать методы контроллера для создания сущностей 2 классов?

    @cicatrix
    было бы большой ошибкой думать
    Я бы вообще сделал один метод на контроллере, а с командой создавать или без, регулировал бы переданным в запросе параметром.
    Ответ написан
  • Как исправить ошибку при подключении к MS SQL Server в ASP Net Core приложении на Ubuntu?

    @cicatrix
    было бы большой ошибкой думать
    Судя по этому сообщению:
    (provider: SSL Provider, error: 31 - Encryption(ssl/tls) handshake failed

    Вполне возможно, в системе не хватает нужного доверенного сертификата.
    Ответ написан
  • Зачем в методе нужен массив и что делать что бы при вводе данных в массив не выкидывало исключение?

    @cicatrix
    было бы большой ошибкой думать
    Вы код спастили криво, по всей видимости. У вас func вложена в main. Это во-первых, а во вторых, зачем - это ведь быстрая сортировка, и да, чтобы отсортировать массив, надо ей его передать. А ввода данных в массив в вашем коде не присутствует в настоящее время.
    Ответ написан
  • Обязательно ли ключевое слово ref для передачи по ссылке?

    @cicatrix
    было бы большой ошибкой думать
    Без ключевого слова ref (out), параметр всегда передаётся по значению (by value).
    В языке есть ссылочные типы и значимые типы (reference type и value types) - вот тут объясняется, в чём разница.

    XElement - ссылочный тип. Вы передаёте адрес объекта (в памяти), иными словами - указатель на объект, иными словами - ссылку. Разумеется, при манипуляции с этой областью памяти, изменяется и сам объект.

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

    @cicatrix
    было бы большой ошибкой думать
    Если браузерный клиент не принимается, зачем вам asp.net? Не web-ом единым жив TCP/IP.

    Уточните, нужен ли сервер вообще, если вся его задача сводится к функции прокладки между клиентом и базой данных, можно обойтись только клиент + серверная БД.
    Клиента пишите на чём угодно. Если в тэги C# поставили - логичный выбор WinForms (можете WPF, конечно, но смысла особого нет).
    Если сервер всё-таки нужен, то можно и windows service написать на том же C# (сервер = не обязательно web сервер)
    Ответ написан
  • Сочетание трех клавиш не работает?

    @cicatrix
    было бы большой ошибкой думать
    Сочетание из трёх клавиш возможно, если две из них - клавиши-модификаторы (Ctrl, Shift или Alt).
    Собственно, из двух клавиш возможно тоже только если одна из них - тот же модификатор.
    Для остального делаются "аккорды" (как, например, в Visual Studio - сначала жмётся Ctrl + что-то, программа ждёт продолжения "аккорда", команда выполняется, когда нажимается следующая клавиша).
    Ответ написан
  • Почему не работает $ в регулярном выражение после lookahead'а?

    @cicatrix
    было бы большой ошибкой думать
    У вас текст однострочный или многострочный?

    Попробуйте в разных режимах:
    Параметры регулярных выражений

    Multiline (?m) Использовать многострочный режим, где ^ и $ соответствуют началу и концу строки текста (а не началу и концу входной строки).

    Singleline (?s) Использовать однострочный режим, где точка (.) соответствует любому символу (а не каждому) символу, кроме \n).
    Ответ написан
  • NancyFx как узнать время выполнения асинхронного запроса?

    @cicatrix
    было бы большой ошибкой думать
    Собственно, вне зависимости от конкретной реализации, вам нужно "засекать" время начала и время окончания задания, смотреть на их разницу.
    В зависимости от того, какое именно вам требуется время (с учётом транспорта до сервера или без его учёта), засекать может как вызывающий компонент, так и сама запускаемая задача.
    Ответ написан
  • Конвертация строки при получении из бд, как исправить?

    @cicatrix
    было бы большой ошибкой думать
    ExecuteScalar выдаст вам ровно то, что хранится в БД. Экранирование, видимо, происходит позднее.
    Если вы пишете на Razor, пользуйтесь Html.Raw(ваша строка)
    Ответ написан
  • Что такое Net Framework и язык C#?

    @cicatrix
    было бы большой ошибкой думать
    Опускаясь до уровня "на пальцах":
    Например, можно написать программу на ассемблере (поскольку он платформеннозависимый), ваша программа будет выполняться, например, только на процессорах архитектуры x86. При этом, вам придётся писать эту же программу для другой архитектуры.

    Поднимемся выше. Напишем программу на C или С++. Она уже отчасти платформеннонезависима, так как при компиляции на разных архитектурах, та или иная реализация компилятора учитывает особенности платформы и генерирует совместимый машинный код. Но допустим, вам необходимо написать что-то сложнее hello world. Вы ищете подходящий функционал в стандартных библиотеках и, допустим, не находите. Зато вы находите подходящую библиотеку А, но вдруг выясняется, что она использует компоненты сторонней библиотеки Б, которая ...
    Ну, в целом, цепочка зависимостей может быть весьма длинной. И вот, ваш проект, ради одной фичи обрастает кучей зависимостей. Более того, вы сталкиваетесь с проблемами лицензирования, так как программный код, который вы гуглите и скачиваете из интернетов, скорее всего распространяется как Open Source, а значит - вы не можете закрывать свой исходный код (всё немного сложнее, но если ваши намерения по распространению своего проекта выходят несколько дальше, чем лабораторная работа по информатике, эти проблемы могут возникнуть).
    У вас может возникнуть желание написать свой "велосипед" под себя, но, тем самым, вы тратите время на создание некоего вспомогательного компонента, и вообще, ваша программа не про это.

    Теперь перейдём к .Net Framework. Разработчики постарались для вас и написали несколько десятков (или сотен) тысяч классов практически подо все умозрительные задачи, которые могут вам понадобиться, то есть это "кубики лего", позволяющие вам БЫСТРО писать приложения, сосредоточившись на логике вашей программы.
    Вам не надо реализовывать свой файловый ввод-вывод, работу с сетью, криптографию, коллекции, работу с базами данных и пр. Всё уже есть, всё пишется в 1-2 строки. Всё готово к употреблению.

    Как же этим пользоваться? В объектами фреймворка можно работать на нескольких языках: C#, VB.Net, F# и что там ещё напридумывали, все они взаимодействуют с Common Language Runtime и имеют доступ ко всем классам фреймворка.
    Ответ написан
  • Задали написать свой Mutex на C#, как лучше?

    @cicatrix
    было бы большой ошибкой думать
    WaitHandle нельзя пользоваться? Мне while не сильно нравится, посмотрите на загрузку процессора с вашим циклом ожидания и WaitHandle
    Ответ написан
  • Как отправить HTML/CSS письмо на электронную почту?

    @cicatrix
    было бы большой ошибкой думать
    А чем стандартный способ отправки через System.Net.Mail.SmtpClient не понравился?
    Ответ написан
  • Как правильно вызвать одну форму из другой?

    @cicatrix
    было бы большой ошибкой думать
    Visual Basic учит вас плохому.
    Он позволяет создать класс формы без явного вызова конструктора. Уходите с него сн C#

    Всегда явно указывайте при помощи слова New:
    frm2 = New Form2
    frm2.Show()
    Ответ написан
  • Как реализовать строчную отладку кода в C#?

    @cicatrix
    было бы большой ошибкой думать
    Кирилл Серов, это одна из причин, по которой не стоит без абсолютно крайней необходимости заниматься метапрограммированием. Собственно, выходов у вас особо нет, либо нагромождать тестовый стенд, который в момент перехода к исполнению вашего сгенерированного текста остановит программу, скинет ваш код в файл, вы его загрузите в отладчик, проинициализируете все переменные и объекты, и отладите.
    Второе - раз уж вы интегрируетесь с экселем, рассмотрите VBA в качестве вашего скриптового языка.
    Третье - файловый ввод-вывод и пошаговое логирование в момент исполнения вашего кода со всей интересующей вас информацией.
    И повторюсь, рассмотрите возможность отказаться от генерации компилируемого кода, используйте хотя бы любой скриптовой язык (vbs, js, ps1, python, и т. д.).
    Ответ написан
  • Как на C# реализовать асинхронную очередь задач у объекта?

    @cicatrix
    было бы большой ошибкой думать
    using System;
    using System.Collections.Generic;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace TasksSample
    {
        public class Worker
        {
            private int id;
            public Worker(int id)
            {
                this.id = id;
            }
            public void DoHardWork()
            {
                Console.WriteLine($"Task {this.id} started.");
                Random rng = new Random();
                int delay = rng.Next(1000, 10000);
                Thread.Sleep(delay);
                Console.WriteLine($"Task {this.id} finished after {delay} ms.");
            } // DoHardWork
        } // class Worker
    
        class Program
        {
            static void Main(string[] args)
            {
                TaskFactory fact = new TaskFactory();
                int TaskCount = 10;
                List<Task> myTasks = new List<Task>();
                for (int id = 0; id < TaskCount; ++id)
                {
                    Worker w = new Worker(id);
                    myTasks.Add(fact.StartNew(() => w.DoHardWork()));
                }
                Task.WaitAll(myTasks.ToArray());
            } // void Main
        } // class Program
    } // namespace TasksSample
    Ответ написан
  • Как правильно считать из XML?

    @cicatrix
    было бы большой ошибкой думать
    Как-то так.
    public class XmlEntry
    {
        public DateTime Date { get; set; }
        public float[] Values { get; set; }
    } // class XmlEntry
    
    public IEnumerable<XmlEntry> ReadFile(string filename)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(filename);
        return doc.SelectNodes("dataset/data/datum") // Здесь возможно подредактировать путь надо, у вас XML обрезан
            .OfType<XmlElement>()
            .Select(e => new XmlEntry
            {
                Date = DateTime.Parse(
                    e.ChildNodes.OfType<XmlElement>()
                    .Where(cn =>
                        cn.Attributes["type"].Value.Equals("date")).FirstOrDefault().InnerText),
                Values =
                    e.ChildNodes.OfType<XmlElement>()
                    .Where(cn =>
                        cn.Attributes["type"].Value.Equals("float"))
                        .Select(node => float.Parse(node.InnerText, System.Globalization.CultureInfo.InvariantCulture))
                        .ToArray()
            }); 
    } // ReadFile
    Ответ написан
  • Использование итераторов foreach?

    @cicatrix
    было бы большой ошибкой думать
    Интерфейсы нужны для того, чтобы с вашими собственными классами могли работать другие классы.
    Например, вы реализовали собтсвенную коллекцию объектов со своей странной логикой. Допустим, вы хотите, чтобы по этой коллекции можно было бы пройтись циклом foreach, но изначально фрейморк понятия не имеет, каким образом осуществлять итерацию объектов внутри вашей коллекции. Вот тогда вы заявляете, что ваш класс реализует интерфейс IEnumerable, и предоставляет наружу реализацию этого интерфейса. Вот тогда фреймворк уже знает, как можно перебрать все элементы коллекции.
    IEnumerable реализует и массив и список и словарь и связный список, то есть для того, чтобы вы могли пройтись по какому-либо классу при помощи foreach, этот класс обязан реализовывать IEnumerable. Считайте интефейс это "соглашение о сотрудничестве" между разными классами, в котором чётко определены правила взаимодействия.
    Ответ написан
  • Как правильно распараллеливать выполнение цикла "For"?

    @cicatrix
    было бы большой ошибкой думать
    Race Condition по всей видимости. Добро пожаловать в мир многопоточности. При параллельном исполнении, нет гарантии, что порядок сохранится. Кто первый встал, того и тапки.
    Я бы вам посоветовал бить массив (или что там у вас в цикле) на 2, 3 ... N частей, строго отводя каждой части свои области (скажем, первый поток заполняет колонки 1...10, второй - 11..20 и т.д.) и запускал бы N синхронных циклов в разных потоках.
    И в принципе, чтобы понять, как работает многопоточность, я бы для начала попробовал всё сделать вручную, при помощи старого доброго System.Threading.Thread. В Tasks многое спрятано "под капот", и можно на много граблей наступить.
    Ответ написан