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

    @mayorovp
    Начну с ответа на ответ выше. Remoting - это не очень-то и красивое решение, его абстракции всюду текут. "Расшаривание" объекта по сети приводит к сложности с определением времени жизни объекта, а простота вызовов методов соблазняет делать кучу мелких запросов вместо одного крупного - что неизбежно приведет к тормозам.

    WCF - идеальное решение. Оно куда проще, чем правильная работа с сокетами - и не страдает недостатками Remoting.

    Транспорт в этой задаче лучше использовать NetTcp - на нем проще реализуется двусторонняя связь. Соединение с клиентом можно поддерживать средствами ReliableSession - тут только выставьте правильные тайм-ауты, а то результат будет странным. Так, тайм-аут на чтение тут лучше поставить вообще бесконечным, а время жизни сессии, напротив, небольшим.
    Ответ написан
    3 комментария
  • Как избежать ошибки Необработанное исключение типа "System.IO.IOException" в mscorlib.dll?

    @mayorovp
    Ошибка возникает потому что вы пытаетесь открыть файл лога из нескольких потоков одновременно. Или вы просто одновременно открыли его в текстовом редакторе.

    PS
    Совет номер 1: откройте для себя NLog
    Совет номер 2: никогда не делайте вот так в цикле
    s_message = mass[i] + Environment.NewLine + s_message;
    - для таких вещей есть StringBuilder, который работает быстрее.
    Совет номер 3: А еще лучше - вместо таких циклов использовать удобный метод
    s_message  = string.Join(Environment.NewLine, mass)

    Совет номер 4: Еще лучше - использовать File.ReadAllText вместо File.ReadAllLines в таких случаях.
    Ответ написан
    1 комментарий
  • Есть ли какой то шаблонизатор для C#?

    @mayorovp
    Нет, Razor Engine сюда не подойдет, потому что оно заточено под вывод html. Но вы можете использовать T4 Text Templates
    Ответ написан
    5 комментариев
  • Отследить событие входа в систему windows из c#?

    @mayorovp
    Вам надо перегрузить вот этот метод:
    ServiceBase.OnSessionChange
    Ответ написан
    Комментировать
  • Большая ли разница для новичка в книгах Рихтера (CLR via c#).Net 2.0 и 4.5?

    @mayorovp
    Из принципиально нового в .NET 4.5 с тех пор появилась только асинхронность. Ну и еще Linq. Книжку по .NET 2.0 можно смело читать - только главы про многопоточные приложения воспринимайте как теорию, а не как руководство к действию.
    Ответ написан
    Комментировать
  • Почему Entity Framework создает новые ключи?

    @mayorovp
    А вы случайно не переименовывали соответствующие поля в модели?

    В любом случае, вы всегда можете принудительно указать требуемые названия полей либо через атрибуты, либо через маппинг, либо через конвенции.
    Ответ написан
    Комментировать
  • Возможно ли получить stack-strace другого потока в С#.NET 3.5?

    @mayorovp
    Нет.
    Ответ написан
    Комментировать
  • Как узнать почему.NET служба долго запускается?

    @mayorovp
    В 2012й студии есть встроенный профайлер, скрывающийся в меню ANALYZE. Из сторонних - можно использовать dotTrace.

    В любом случае, прежде всего лучше переписать службу так, чтобы она могла запускаться как консольный процесс. Если еще и вывод лога в консоль добавить - то многие вещи можно будет увидеть визуально.
    Ответ написан
    4 комментария
  • Как отловить события WebBrowser в программе .net?

    @mayorovp
    Вам хочется очень странного, и что-то в вашей программе, определенно, лишнее: либо WebBrowser, либо остальная программа :) В первом случае - изучайте XAML, все что вы пытаетесь сделать в WebBrowser можно сделать и на нем. Во втором случае - создайте веб-приложение на ASP.NET и открывайте его в обычном браузере.
    Ответ написан
  • Получаю xml по url, как сохранить содержимое в новый xml файл, только чтобы структура не нарушилась?

    @mayorovp
    По первому варианту - что означает "нарушается структура"? Не должна она нарушаться при посимвольном копировании. Однако, тут возможны проблемы с кодировками. Нужную кодировку надо определять либо по ContentType - либо по декларации xml.

    По второму варианту - разумеется, это и не должно работать. Прочитайте в документации, что делает ReadString.

    --

    Теперь как надо сохранять xml. Вариант первый - просто побайтово. Используйте stream напрямую, не оборачивая его в StreamReader - а для записи используйте FileStream.

    Вариант второй - загрузить поток в XmlDocument или XDocument на выбор, а потом сохранить.
    Ответ написан
    Комментировать
  • Как получить данные из стандартных команд cmd.exe в своем приложении на C#, не вызывая подпрограммы?

    @mayorovp
    У вас путаница в мыслях... Во-первых, "подпрограмма" - это в C# синоним метода. Если вы используете winforms - то вы уже используете кучу подпрограмм :) А то, чего вы хотите избежать, называется "внешняя программа" или "дочерний процесс".

    Во-вторых, рефлексия возможна только в отношении программ на платформе .NET - а перечисленные вами программы являются нативными. Разумеется, рефлексия в их отношении невозможна. По той же причине бесполезно из декомпилировать - все равно вам надо будет писать то же самое на другом языке.

    В-третьих, ping, tracert и netsh не являются командами cmd.exe. Команды cmd.exe - это echo, if, call, set, goto, for и т.д., а то, что вы перечислили - это системные утилиты.

    Теперь по вопросу.

    ping. Имеется вот этот класс: msdn.microsoft.com/en-us/library/system.net.networ... Ни разу с ним не работал, но выглядит удобным.

    tracert. Используйте тот же класс, указав Ttl в PingOptions.

    netsh. Тут все сложнее. Дело в том, что эта программа - обертка для кучи разных настроек, находящихся в совершенно разных местах. Если вам нужно получать данные - то попробуйте поискать их в msdn.microsoft.com/en-us/library/system.net.networ... Если их там нет - гуглите. Главное - гуглите без ключевого слова netsh.

    etc. А вот тут все не просто сложно, а невозможно. Невозможно взять неизвестную заранее утилиту, и сделать то же самое, что она делает, не запуская ее при этом. Поэтому вам надо определиться - либо ваша программа умеет выполнять фиксированный список действий - либо ей можно передать любую команду, но она будет запускать дочерние процессы. Возможен и промежуточный вариант - есть действия, которые программа может выполнять сама, а для выполнения других будут запускаться дочерние процессы.
    Ответ написан
    Комментировать
  • C# webview. Как запустить веб клиент в обход прокси?

    @mayorovp
    Надо добавить не "эти строки", а "эту строку". Конкретно, выключает использование прокси строка request.Proxy = null; - вам надо найти все места, где создаются запросы, и добавить аналогичную строчку в каждое. Говорю "аналогичную" - потому что имя переменной (которое request) может отличаться.

    Кстати, запросы могут создаваться не только через WebRequest - но и через WebClient.

    ---

    К счастью, на самом деле эта задача не требует даже перекомпилировать программу заново. Надо взять файл конфигурации для программы (для программы foo.exe он будет называться foo.exe.config), и сделать в нем следующее:
    <configuration>
      <system.net>
        <defaultProxy enabled="false" />
      </system.net>
    </configuration>


    Но тут надо помнить, что если какие-то разделы в этом файле уже есть, то надо их объединить с приведенными выше, а не дублировать. Так, корневой элемент configuration в этом файле наверняка уже будет - новый дописывать не надо.

    Подробности по декларативной настройке использования прокси-сервера - тут.

    ---

    PS очевидно, вы не программист. Как вообще получилось, что вам дали такую задачу?
    Ответ написан
    Комментировать
  • C# или ActionScript?

    @mayorovp
    Возможность доступа из сети. Открыл браузер, ввел адрес - и вот она программа. HTML5 + ASP.NET, думаю решают это запросто.
    Ни разу не аргумент: нельзя сравнивать серверный язык с клиентским. Если нужен именно C# - то надо смотреть в сторону Silverlight или Unity. Однако, Silverlight использует другую стандартную библиотеку - а Unity вообще другой компилятор.

    Возможность быстро считать (наши программы расчетные). Мне кажется, что ActionScript (а видимо Flash) тут проигрывает .NET. Не уверен, тесты сам лично не делал.
    Сделайте тесты, чтобы быть уверенным.

    Возможность "рисовать" интерфейс, делать его нестандартным. Думаю, XAML, HTML + CSS - отличный выбор.
    Здесь графический редактор, конечно, выигрывает у языка общего назначения :) Но стоит напомнить начальнику про разные размеры мониторов у разных пользователей. Flash умеет в лучшем случае масштабировать картинку, остальное - через боль.

    С недавнего времени заинтересовала кроссплатформенность. Чтобы программы запускались на Android, iOS. Чувствую, что с ActionScript это будут особенные грабли.
    Flash на андроидах не поддерживается ни дефолтным браузером, ни хромом - Action Script, соответственно, тоже. Про другие браузеры не знаю, но этих достаточно.
    Ответ написан
    Комментировать
  • Как запустить Task после его выполнения?

    @mayorovp
    Я немного не понял, вам надо запускать задачи последовательно или параллельно? А если параллельно - то обрабатывать результаты сразу или вместе?

    1. Последовательный запуск:
    private async void OnlyLike()
    {
        for (var i=0; i<5; i++)
            TextBox.Text += await VK.NakrytkaLike(KeyAntigateTextBox.Text);
    }


    2. Параллельный запуск, обработка всех результатов вместе
    private async void OnlyLike()
    {
        var tasks = Enumerable.Range(0, 5).Select(i => VK.NakrytkaLike(KeyAntigateTextBox.Text));
        foreach (var result in await Task.WhenAll(tasks))
            TextBox.Text += result;
    }


    3. Параллельный запуск, обработка результатов сразу же:
    private async void OnlyLike()
    {
        TextBox.Text += await VK.NakrytkaLike(KeyAntigateTextBox.Text);
    }
    
    private void StartButton_Click(object sender, RoutedEventArgs e)
    {
        for (var i=0; i<5; i++)
            OnlyLike();
    }


    Выбирайте что нравится. И не бойтесь использовать async/await - оно создано для упрощения кода, а не для усложнения :)

    UPD

    Последовательный запуск на фреймворке 4.0:
    public void OnlyLike()
    {
        var scheduler = TaskScheduler.Current ?? TaskScheduler.FromCurrentSynchronizationContext();
        Task task = TaskEx.FromResult(false);
        var text = KeyAntigateTextBox.Text;
        for (var i=0; i<5; i++) {
            task = task.ContinueWith(_ => {
                var LikeTurbo = VK.NakrytkaLike(text);
                LikeTurbo.ContinueWith(_ => {
                     TextBox.Text += LikeTurbo.Result;
                }, scheduler);
                return LikeTurbo;
            }, TaskContinuationOptions.ExecuteSynchronously).Unwrap();
        }
    }
    
    ...
    
    public static class TaskEx {
        public static Task<T> FromResult<T> (T result) {
            var tcs = new TaskCompletionSource<T>();
            tcs.SetResult(result);
            return tcs.Task;
        }
    
        public static Task<T> Unwrap<T>(this Task<Task<T>> task) {
            var tcs = new TaskCompletionSource<T>();
            task.ContinueWith(_ => {
                if (task.IsCanceled) tcs.SetCancelled();
                else if (task.IsFaulted) tcs.SetException(task.Exception);
                else task.Result.ContinueWith(innerTask => {
                    if (innerTask.IsCanceled) tcs.SetCancelled();
                    else if (innerTask.IsFaulted) tcs.SetException(task.Exception);
                    else tcs.SetResult(innerTask.Result);
                }, TaskContinuationOptions.ExecuteSynchronously);
            }, TaskContinuationOptions.ExecuteSynchronously);
            return tcs.Task;
        }
    }


    Выглядит многословно, но на самом деле - ничего сложного. В цикле задачи ставятся в очередь одна за другой при помощи конструкции task = task.ContinueWith(...).Unwrap(). Здесь Unwrap() - это функция, позволяющая дождаться выполнения дочерней задачи, фактически простой распаковщик монады Task Task T -> Task T.

    Внутри такого цикла находится, фактически, старый код метода OnlyLike() - за тем исключением, что теперь он еще и возвращает ту задачу, которую создал (это нужно, чтобы дождаться ее выполнения). Здесь я позволил себе небольшое ускорение - поскольку я написал return LikeTurbo - каждая следующая итерация цикла будет ждать лишь предыдущей задачи VK.NakrytkaLike - но не будет ждать вывода на экран предыдущих результатов. Если важно именно дождаться вывода результатов - то надо возвращать не LikeTurbo, а результат ContinueWith.

    Также тут очень важно расположение вызова TaskScheduler.FromCurrentSynchronizationContext(); Поскольку в момент исполнения прошлой задачи мы можем находиться в любом контексте - то ориентироваться на текущий контекст нельзя. Нужный нам планировщик задач следует сохранить при входе в метод (на будущее: его нужно _всегда_ сохранять _только_ при входе в метод!)
    Ответ написан
  • Как в коде узнать про гиперпотоковость?

    @mayorovp
    Насколько я понимаю, дело не в HyperThreading - а в числе одновременно исполняемых потоков. В этом плане HyperThreading и "честные" многоядерные процессоры ничем не отличаются. Так что можете использовать функцию GetMaximumProcessorCount.

    msdn.microsoft.com/en-us/library/windows/desktop/d...

    PS а вообще, забудьте про устаревшие технологии. Сейчас в телефоны по 4 ядра ставят.
    Ответ написан
    Комментировать
  • Есть ли хорошие примеры Echo сервера на базе WCF службы и простого консольного Echo клиента?

    @mayorovp
    Для такой задачи затруднительно написать нерабочий пример. Вероятно, все примеры были рабочими, только вот вы не смогли их запустить.

    Сложности с запуском - на стороне сервера. Если вы используете http биндинг, то self-hosted сервису нужны права на прослушиваемый URL - а asp.net-hosted сервису нужен, собственно, работающий asp.net сайт, которому, в свою очередь, нужен веб-сервер.

    Приводите конкретный "нерабочий" пример - будем разбираться, что там не работает.
    Ответ написан
    Комментировать
  • Application.Settings .NET - безопасно ли хранить там пароль?

    @mayorovp
    На "семерке" эти данные сохраняются в C:\Users\$(username)\AppData\Local в файле user.config, формат точно такой же, как и в app.config/web.config
    Ответ написан
    Комментировать
  • Библиотека Moq: Как вернуть список List в эмулируемом методе?

    @mayorovp
    Проблема тут:
    x.ExecuteQuery (predicate)

    Что-то мне подсказывает, что Mock не может сравнить два предиката - вот и получается null. Используйте It.IsAny вместо predicate.
    Ответ написан
  • Почему Automapper не мапит коллекции объектов EF в коллекции контейнеров?

    @mayorovp
    Mapper.CreateMap<IEnumerable<MediaContainer>, IEnumerable<MediaEntity>>();
    Mapper.CreateMap<IEnumerable<MediaEntity>, IEnumerable<MediaContainer>>();
    Для начала уберите эти строки. Automapper сам разберется, что ему делать с перечислениями.
    Ответ написан
    Комментировать