• Как на C# реализовать асинхронную очередь задач у объекта?

    lam0x86
    @lam0x86
    class Program
        {
            static void Main(string[] args)
            {
                MainAsync(args).GetAwaiter().GetResult();
    
                Console.ReadKey();
            }
    
            static async Task MainAsync(string[] args)
            {
                HardWorker hardWorker1 = new HardWorker();
                HardWorker hardWorker2 = new HardWorker();
                HardWorker hardWorker3 = new HardWorker();
                HardWorker hardWorker4 = new HardWorker();
                HardWorker hardWorker5 = new HardWorker();
    
                Task t1 = Task.CompletedTask;
                Task t2 = Task.CompletedTask;
                Task t3 = Task.CompletedTask;
                Task t4 = Task.CompletedTask;
                Task t5 = Task.CompletedTask;
    
                Random rand = new Random();
    
                for (int i = 0; i < 50; i++)
                {
                    t1 = t1.ContinueWith(task => hardWorker1.DoSomething(1, rand.Next(1, 10000)));
                    t2 = t2.ContinueWith(task => hardWorker2.DoSomething(2, rand.Next(1, 10000)));
                    t3 = t3.ContinueWith(task => hardWorker3.DoSomething(3, rand.Next(1, 10000)));
                    t4 = t4.ContinueWith(task => hardWorker4.DoSomething(4, rand.Next(1, 10000)));
                    t5 = t5.ContinueWith(task => hardWorker5.DoSomething(5, rand.Next(1, 10000)));
                }
    
                await Task.WhenAll(t1, t2, t3, t4, t5);
            }
        }
    
        public class HardWorker : AbstractHardWorker
        {
            public void DoSomething(int task, int time)
            {
                Console.Out.WriteLine("Start: " + task);
                Thread.Sleep(time);
                Console.Out.WriteLine("End: " + task);
            }
        }
    
        public interface AbstractHardWorker
        {
            void DoSomething(int task, int time);
        }
    Ответ написан
    3 комментария
  • Возможно ли все dll библиотеки в проекте "сложить" в один исполняемый файл?

    lam0x86
    @lam0x86
    Самый популярный инструмент для этого - ILMerge. Есть в виде nuget-пакета, и может выполняться во время билда.
    Ответ написан
    Комментировать
  • Почему не обрабатывается файл блоками?

    lam0x86
    @lam0x86
    Возможно, вместо
    var bytes1 = new byte[writeStream.Length];
    writeStream.Read(bytes1, 0, bytes1.Length);
    writer.Write(bytes1, 0, bytes1.Length);

    следует написать что-то типа
    writeStream.Position = 0;
    writeStream.CopyTo(writer);
    Ответ написан
  • Как создать множество окон веб браузера и получить доступ к объектам javascript из основной программы на C#?

    lam0x86
    @lam0x86
    Проще всего использовать адаптер для Chromium типа CefSharp.
    Он умеет работать без создания окон на экране.
    А вот пример, как выполнить свой javascript-метод внутри подгруженной страницы и вернуть результат обратно в C#.
    Ответ написан
    Комментировать
  • C#: Как правильно получить доступ к конфигурациям в доменной модели?

    lam0x86
    @lam0x86
    Лучше не держать ничего лишнего в доменных сущностях. На мой взгляд, следует сделать IIssueService, в который перенести методы AcceptToWork, Close и т.д., которые будут принимать на вход ту Issue, над которой выполняется действие.
    И тогда можно конфигурить этот IIssueService различными менеджерами типа IConfigurationManager и IDateTimeProvider.
    Ответ написан
    Комментировать
  • Как получить такой эффект в вебе?

    lam0x86
    @lam0x86
    Вот, есть пример: jsfiddle.net/otinanaipali/bwx1d977
    Но не уверен, что это универсальное решение. Кажется, в Хроме были подвижки внедрить blur для нижележащих элементов, но всё упёрлось в производительность. Сходу не нашёл, где читал про это.
    Ответ написан
    Комментировать
  • Что я делаю не так при создании свойства зависимости в wpf?

    lam0x86
    @lam0x86
    Скорее всего, canvas1.Background у вас равен Brushes.White. Это синглтон, и он находится в состоянии Frozen (свойство IsFrozen == true), то есть его нельзя менять. Попробуйте указать "#FFFFFF" вместо "White".
    Ответ написан
    3 комментария
  • Как работает AddAfter LinkedList c#?

    lam0x86
    @lam0x86
    Во-первых, привыкайте к стандартам code style. Имена классов, методов и свойств должны начинаться с заглавной буквы. Кроме того избегайте транслитерации - пусть лучше это будет кривой английский, чем "pritok" и "nStran". А в вашем случае, rivers должно быть просто River (единственное число).
    Во-вторых, у LinkedList есть метод AddLast, который добавляет элемент в конец. AddAfter не нужен тут.
    В-третьих, использование LinkedList не оправдано в 99.99% случаев. Есть много материала на эту тему в гугле по запросу "List vs LinkedList performance" (можно поискать на русском "Производительность List и LinkedList").
    В-четвёртых, советую почитать про оператор using и обработку исключений. Ваше решение упадёт при некорректных данных в файле.

    Но это всё лирика. А проблема у вас в том, что вы создаете объект rivers только один раз, а в цикле изменяете его свойства. Получается, что весь ваш список состоит из множества ссылок на один и тот же объект. Если переименуете класс в River, возможно, поймете свою ошибку.
    Ответ написан
    Комментировать
  • Как правильно переопредетиль Equals?

    lam0x86
    @lam0x86
    Во-первых, не забывайте про правило Equals + GetHashCode. При переопределении Equals следует переопределять GetHashCode.

    Во-вторых, переопределять Equals и GetHashCode для изменяемых типов - плохая практика. Всегда есть вероятность, что объект будет использован в HashSet'е или Dictionary, а они требуют неизменности ключа. GetHashCode в идеале должен быть стабильным, то есть всегда возвращать одинаковое значение.

    В третьих (это уже моё субъективное мнение), в большинстве случаев вообще не стоит переопределять эти методы. Кроме, может быть, совсем примитивных типов вроде "строка", "комплексное число", "дата" и т.п. То есть, там, где не может быть никаких разночтений.
    Объекты бизнес-логики чаще всего могут быть одновременно равны и не равны в разных контекстах сравнения. Например, где-то необходимо сравнить двух пользователей по ФИО, а в другом месте - глубокое сравнение всех полей, в т.ч. телефон и имейл. В первом случае объекты могут быть равны, а во втором различны.
    В этом случае стоит написать несколько компараторов, реализовав интерфейс IEqualityComparer, и передавать нужный компаратор в нужном месте, например, в конструктор Dictionary.
    Ответ написан
    Комментировать
  • Что должна возвращать функция в catch блоке?

    lam0x86
    @lam0x86
    Если метод может упасть, при этом не понятно, что он должен в этом случае вернуть, правильнее не ловить исключение вообще. Обрабатывать исключение надо на том уровне, где ясно, как с ним поступить.
    Более продвинутый вариант - ловить исключение, логгировать ошибку, и пробрасывать его дальше в сыром виде (throw;) или в обёртке из business-specific исключения:
    try
    {
      return int.Parse(stringValue);
    }
    catch (FormatException ex)
    {
      Logger.Error(ex);
      throw new MyParserException($"Неверный формат числа {stringValue}", ex);
    }
    catch (OverflowException ex)
    {
      Logger.Error(ex);
      throw new MyParserException($"Выход за допустимый диапазон {stringValue}", ex);
    }
    .
    Ответ написан
    Комментировать
  • Как придумывать осмысленные имена для классов?

    lam0x86
    @lam0x86
    1) Изучать популярные проекты на гитхабе, независимо от языка программирования.
    2) Использовать словарь (мне Лингво очень помогает).

    Моё мнение - чем необычнее имя сущности (в разумных пределах), тем проще запоминать структуру проекта. Когда приходится разбираться в чужих проектах, где половина классов называется ControllerBase, ControllerImpl, AbstractControllerFactory и т.п., хочется вешаться.
    Ответ написан
    Комментировать
  • Как использовать DependencyProperty?

    lam0x86
    @lam0x86
    Напишите конвертер, который будет реализовывать IMultiValueConverter и перемножать то, что приходит к нему на вход. В xaml-е у secondBox-а определите байндинг не атрибутом, а внутренним элементом, указав в качестве конвертера свою реализацию и внутренние привязки.
    Ответ написан
  • С# .Net 3.5 - есть ли возможность не внедрять сгенерированные Interop .dll файлы?

    lam0x86
    @lam0x86
    Декомпилируйте сгенерированную interop-сборку и добавьте её в свой проект.
    Ответ написан
    2 комментария
  • Есть ли эффективная реализация словаря у которого ключ регулярное выражение?

    lam0x86
    @lam0x86
    Регулярное выражение - это частный случай конечного автомата. Перед вами по сути стоит задача объединения всех выражений в один автомат, где начальным будет epsilon-состояние, т.е. в недетерминированный конечный автомат. Из него потом надо построить детерминированный КА с терминальными состояниями с соответствующими значениями из словоря. В общем, довольно непростое решение, но будет быстрее линейного перебора.
    Как вариант, можно объединить все ключи словаря в одно регулярное выражение по принципу "(a1)|(a2)|...|(aN)", и затем определить, какая из групп окажется не пустой после матчинга. Это, по сути, то же самое, что я написал вначале, только гораздо проще.
    Ответ написан
  • Как обработать огромный текстовый файл?

    lam0x86
    @lam0x86
    Если строки короткие, то, в принципе, подойдёт такое решение:
    var secondFileLines = new HashSet<string>(File.ReadLines("<файл2>"));
    using (var writer = new StreamWriter("<файл3>"))
    {
        foreach (var line in File.ReadLines("<файл1>"))
        {
            if (!secondFileLines.Contains(line))
            {
                writer.WriteLine(line);
            }
        }
    }


    Если длина строк неограничена, то могут возникнуть проблемы с расходом памяти. В этом случае, всё сильно усложняется. Вам, вероятно, придётся хранить набор хэш-кодов строк из второго файла и сравнивать с хэш-кодом каждой строки из первого. Но тут могут возникнуть ложно-положительные срабатывания, если у разных строк хэши будут совпадать. В этом случае, необходимо будет сравнивать строки посимвольно. Это при идеальной реализации. Впрочем, вероятность совпадения хэшей - 1/2^32. Ну, и надо умножить на 70 миллионов. Если задача позволяет добавить пару лишних строк в результирующий файл, я бы так и поступил.
    Можно немного улучшить алгоритм с хэшами: если, например, использовать 256-битную хэш-функцию, а не стандартную (GetHashCode), можно снизить вероятность ложного срабатывания до 1e-77 (в случае использования SHA1). Думаю, такой мизерной вероятности будет достаточно, чтобы считать задачу решённой. Правда, придётся немного усложнить алгоритм сравнения хэшей - придётся сравнивать массивы.
    Ответ написан
    3 комментария
  • WPF. Какие элементы использовать в мессенджер-приложении?

    lam0x86
    @lam0x86
    Grid явно не подходит в силу отсутствия виртуализации. ListBox на первых порах подойдёт, но затем, скорее всего, вы всё-равно столкнётесь с его ограничениями - он поддерживает только визуальную виртуализацию, но не виртуализацию данных. Скажем, чат из 100 сообщений будет летать, но если вы планируете делать поддержку групповых чатов и с бесконечной историей, то есть вероятность, что приложение будет неотзывчивым уже начиная с 1000 сообщений истории.
    В общем, до этого надо еще дожить. Скорее всего, хватит ListBox (или ListView) как для списка чатов, так и для самих чатов. Идею с Grid-ом советую сразу отбросить - хотя бы из-за прожорливости в плане оперативки.
    Ответ написан
    4 комментария
  • Какая часть транслятора должна отслеживать ошибку типа "неверный формат числа"?

    lam0x86
    @lam0x86
    На этапе лексического анализа проверить валидность лексемы не всегда возможно. Скажем, тип данных int32 (условное название типа, содержащего знаковое 32-битное целое) может хранить число в диапазоне [-2147483648; 2147483647]. При этом, константное выражение "2147483648" считается невалидным, а то же самое, но со знаком минус "-2147483648" - вполне валидно. В идеале, лексический анализатор не должен знать о знаке числа. Определение того, унарный или бинарный это минус (а может, язык поддерживает интервалы типа "10-100" или еще какую-то экзотику), лежит на плечах синтаксического анализатора.
    Однако, базовый анализ валидности токенов действительно проще делать в лексическом анализаторе. Например, строковые литералы чаще всего проверяются на валидность escape-символов именно в процессе лексического анализа. Чем раньше будет найдена ошибка, тем проще восстановить ошибочное состояние анализатора.
    Ответ написан
    Комментировать
  • Почему не работает перенаправление ввода/вывода консольного приложения?

    lam0x86
    @lam0x86
    Во-первых, ошибка в том, что вы указываете выходной файл.
    Во-вторых, нужно явно интерпретировать выход как UTF8.

    Process p = new Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.FileName = "mystem.exe";
                p.StartInfo.Arguments = "-n input.txt";
                p.Start();
                using (var reader = new StreamReader(p.StandardOutput.BaseStream, Encoding.UTF8))
                {
                    textBox3.Text = reader.ReadToEnd();
                }
                p.WaitForExit();


    Или, может, я не понял вопроса, и вы хотите выводить и в файл, и в выходной поток? Похоже, что данная утилита так не умеет. Придётся сохранять файл самому.
    Ответ написан