Ответы пользователя по тегу C#
  • Практики регулирования доступа к кэшированным (редко изменяемым) данным в условиях многопоточности?

    w1ld
    @w1ld
    Программирую
    если в момент чтения того или иного свойства происходит обновление или удаление, то я должен оборачивать в блокировку режима чтения каждое поле/свойство?

    Что-то это уже не похоже на кэш. Может быть, когда изменяется объект, то из кэша убирать его _после_ изменения. Тогда последующие потоки получат верный объект. А операции добавления и удаления в ConcurrentDictionary потокобезопасны. Т.е. идея в том чтобы не изменять объект в кэше никогда, а только удалять и добавлять.

    Существует смежная проблема: поля в некоторых сущностях являются списками ...

    Ну, теже ConcurrentQueue, СoncurrentStack поддерживают GetEnumerable, который делает копию всего списка. Тогда не страшно, что кто-то изменит список.
    Тогда можно без сторонних библиотек обойтись. Вообще, сложно что-то сказать конкретно без кода.
    Ответ написан
    2 комментария
  • Вопросы по потокобезопасности коллекций и объектов?

    w1ld
    @w1ld
    Программирую
    1. Ну, `List` не потокобезопасен. Для избежания Kernel-mode constructs (`lock` и пр.) можно попробовать потокобезопасные ConcurrentQueue или ConcurrentStack в System.Collections.Concurrent, если заполнение до чтения (а не вовремя). Наполняете, вызываете GetEnumerable, который делает снэпшот коллекции, сравниваете. Чтение должно происходить без блокировки.

    2. BlockingCollection для проблемы producer-consumer, когда одновременно чтение и запись. Я так понял это не входит в задачу.

    3. Если вы не изменяете, то и блокировать не нужно. Вне зависимости от reference или value type. (Конечно, через стэк лучше, если изменяете. Тогда копия для каждого потока своя.)

    По теме можно Рихтера почитать, CLR via C#, 10 глава, Asynchronous Synchronization и The Concurrent Collection Classes
    Ответ написан
    Комментировать
  • C# + ffmpeg для начинающего, что почитать?

    w1ld
    @w1ld
    Программирую
    А почему именно C#? М.б. Powershell скрипт подойдет. Проще и не надо деплоить и быстро можно исправить. Если просто нужно вызывать ffmpeg из окружения, то можно обернуть параментры в форму. К примеру вот мануал как содавать формочки просты из Powershell - https://technet.microsoft.com/en-us/library/ff7309...

    И там где-нибудь так:
    $OKButton.Add_Click({$inFile=$objTextBox.Text;$objForm.Close()})   # это обработка нажатия на кнопку
    & ffmpeg $inFile  # это вызов скрипта

    Изи :)
    Ответ написан
  • Как провести удаление функции в c#?

    w1ld
    @w1ld
    Программирую
    public interface IActionable {
        bool CanFunction { get; set; }
    }
    
    public class Doctor : IActionable
    {
        public bool CanFunction { get; set; }
        public void Heal () { 
            if( ! CanFunction) return;
            // heal!
        }
    }
    
    public class Beauty : IActionable { 
        public void Disable(IActionable someone) { 
            someone.CanFunction = false;
        }
    }
    Ответ написан
    Комментировать
  • Что лучше использовать в NUnit?

    w1ld
    @w1ld
    Программирую
    У fluentassertions (http://fluentassertions.com) удобный fluent синтаксис в стиле behavior-driven development. Есть методы проверки для массивов, для строк. Наглядно и удобно. А nunit мне кажется не так удобен как xunit: интересная модель создания объекта под тест, не надо всякие аттрибуты проставлять и др.
    Ответ написан
    Комментировать
  • Реализация шаблона UnitOfWork при работе с транзакциями EntityFramework?

    w1ld
    @w1ld
    Программирую
    2 вопрос. Смотря, что вы делаете. Обычно он для транзакции создается. А транзакция по идее как раз должна бы укладываться в веб запрос.

    3 вопрос. Вы про IApplicationDbContext ? Не понятно что это такое. Это IDbContext ? Если так, то странно его создавать на Lifetimescope у Autofac, ведь он тогда, должно быть, будет жить в этом контейнере до конца жизни домена. EF контекст же легкий и предполагает частое создание и удаление.

    Вообще, как-то вы странно обходитесь с UoW: обязываете бизнес логику заботиться об изоляции транзакций. Это "попахивает" тем, что data access логика в бизнес модели. Возможно, было бы лучше передать обязоность UoW репозиторию. Я имею в виду то, что у репозитория был бы метод Commit и не атомарные методы, а ожидающие завершения транзакции. Тогда не надо думать в бизнес логике об этом. Еще, может быть TransactionScope для реализации изоляции транзакций помог бы.
    Ответ написан
    Комментировать
  • Книга по шаблонам проектирования?

    w1ld
    @w1ld
    Программирую
    По корпоративным приложением. Для того чтобы получить актуальную картинку, как оно сейчас делается можно посмотреть на "Microsoft .NET. Architecting Applications for the Enterprise, Second Edition" от Dino Esposito и Andrea Saltarello.

    А для понимания этой книги уже придеться читать связанные книги. А это
    - "Domain-Driven Design: Tackling Complexity in the Heart of Software" от Eric Evans;
    - книга Банды четырех (м.б. покажется устаревшей);
    - "Patterns of Enterprise Application Architecture" от Фаулера и других; также его Рефакторинг;
    - и др.
    Ответ написан
    Комментировать
  • C# unit testing best practices?

    w1ld
    @w1ld
    Программирую
    Использовали xUnit и FluentAssertions. Для моков -- Moq . Для BDD -- Specflow.
    Ответ написан
    1 комментарий
  • Не работает поиск по data, но по number работает, почему?

    w1ld
    @w1ld
    Программирую
    Там в `textBox8_TextChanged` пропущено в начале `%`. Д.б. так:

    private void textBox8_TextChanged(object sender, EventArgs e)
            {
                if (comboBox1.Text == "number")
                {
                    SqlConnection po = new SqlConnection("Data Source=max;Initial Catalog=lr;Integrated Security=True");
                    SqlDataAdapter sda = new SqlDataAdapter("SELECT number,name,city, data FROM people WHERE number like '%" + textBox8.Text + "%' ", po);
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    dataGridView1.DataSource = dt;
                }
                else if (comboBox1.Text == "data")
                {
                    SqlConnection po = new SqlConnection("Data Source=max;Initial Catalog=lr;Integrated Security=True");
                    SqlDataAdapter sda = new SqlDataAdapter("SELECT number,name,city, data FROM people WHERE data like '%" + textBox8.Text + "%'", po);
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    dataGridView1.DataSource = dt;
                }
            }


    ЗЫ. Надеюсь это на 1-2 дня код, а не в продакшн. Много зависимостей и др.
    Ответ написан
    1 комментарий
  • Как работать с SecureString?

    w1ld
    @w1ld
    Программирую
    Видимо, смысл в том, чтобы не использовать String вообще, т.к. он может быть скопирован (любое манипулирование с ним) и непонятно, когда удалиться из памяти. Когда это нужно? Тогда, когда нет доверия к другим процессам, коду в одном окружении. Например, запуск процесса под админом; доступ в сеть. А работать с ним через указатели только. Так возможно и сравнить и в БД добавить. (См. статьи в инете как.)
    Ответ написан
  • Какую литературу читать новичку по C#?

    w1ld
    @w1ld
    Программирую
    У братьев Albahari хорошее издание есть, "C# 6.0 in a Nutshell" (www.albahari.com/nutshell ) Там именно C#, а затем уже по фреймворку. Книга популярна, постоянно обновляется. У них есть еще LINQPad, там можно примеры посмотреть из книги.
    Ответ написан
    Комментировать
  • Как запретить повторный вызов стороннего exe?

    w1ld
    @w1ld
    Программирую
    Запретить самому себе можно так:
    using System.Diagnostics;
    
    // где-то в программе:
    Process[] processlist = Process.GetProcesses();
    bool found = processlist.SingleOrDefault(p => p.ProcessName.Contains("Project1")) != null;
    if(!found)	Process.Start("Project1.exe");

    А вот другим запретить, думаю, можно, переименовав или переместив программу.
    Ответ написан
  • Как в C# строку, полученную через (BitConverter), преобразовать обратно в byte[]?

    w1ld
    @w1ld
    Программирую
    Ответ есть на stackoverflow.com/questions/724862/hex-to-string-c...

    Неверно:
    Encoding.Unicode.GetBytes(BitConverter.ToString(hash).Replace("-", string.Empty));
    Ответ написан