Ответы пользователя по тегу C#
  • Как правильно возвращать объект из async метода в .NET?

    @kttotto
    пофиг на чем писать
    1. У Вас корректные примеры, никаких await Task.FromResult не нужно.
    2.
    при вызове метода GetRequestResult придётся писать await

    Придется. async/await заразен, он вынуждено подымается вверх по вызовам. С с .Result Вы убьете асинхронность, сомневаюсь, что в Ваше случае есть необходимость в его применении.

    Бест практика одна - использовать его как будто это обычный метод, в этом и красота его применения. await перед вызовом говорит только, что вызывающий поток освободится. Ну и нужно помнить о контексте синхронизации и понимать когда можно сделать .ConfigureAwait(false).
    Ответ написан
    6 комментариев
  • Высокоуровневые макросы в C#, есть ли готовые решения?

    @kttotto
    пофиг на чем писать
    Ищите scaffolding для .net, но пишется он на основе t4. Именно так пишутся шаблоны типов проектов для vs.
    Первое, что показал поиск тут.

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

    @kttotto
    пофиг на чем писать
    Первое, если OrderService не будет резолвится как синглтон, то на каждый запрос будет создваться свой инстанс сервиса, т.е двух потоков на один метод не будет.

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

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

    Ну и четвертое, если хотите получить баланс до того как другой запрос туда что-то добавит, то в AddOrder используйте транзакции с достаточным уровнем блокировки на изменение.
    Ответ написан
    3 комментария
  • Что значит инъецировать, а также создавать один класс от другого (паттерн MVP) в C#?

    @kttotto
    пофиг на чем писать
    1. Инъецирует, значит не создает экземпляр внутри себя (т.е. не делает new Service()), а принимает Service как параметр, чаще всего как параметр конструктора
    var service = new Service();
    var presenter = new Presenter(service);

    2. Да, это значит, что презентер должен создать внутри себя модель и вернуть ее для отображения. И в тексте не написано, что это view. Это две разные модели.
    Ответ написан
    Комментировать
  • Как получать по 5 элементов из массива?

    @kttotto
    пофиг на чем писать
    C#
    1. list.Skip(n).Take(5)
    2.
    var slice = new ArraySegment<string>(list, n, n + 5)

    3. Можете еще использовать очередь
    var queue = Queue<string>() { ... };
    var el1 = queue.Dequeue()
    var el2 = queue.Dequeue()
    var el3 = queue.Dequeue()
    var el4 = queue.Dequeue()
    var el5 = queue.Dequeue()
    Ответ написан
    2 комментария
  • С# стоимость приведения типа?

    @kttotto
    пофиг на чем писать
    Для ссылочных типов, в рантайме, это почти ничего не стоит. Основная проверка привидения происходит на стадии компиляции.
    По сути при таком приведении нет необходимости создавать новый объект, перемещать его в памяти. Просто ссылка entity, теперь будет указывать на объект MyType, но доступ к интерфейсу будет другой.
    В рантайме можно упасть с ошибкой привидения, если Вы в object положили MyType1, а привести пытаетесь к MyType2, интерфейсы совпадать не будут и ясно, что вызывать будет нечего.

    PS: Посмотрел поиском, это все написано в MSDN
    Операция приведения между ссылочными типами не меняет тип времени выполнения базового объекта; изменяется только тип значения, который используется в качестве ссылки на этот объект.
    Ответ написан
    6 комментариев
  • C# модульная архитектура. Как получить доступ к стат. классу программы из плагина?

    @kttotto
    пофиг на чем писать
    Если плагину предоставляется апи приложения, вот и добавьте апи, через который будете отдавать плагину инфу своего статического класса.
    Либо плагин, при инициализации, должен иметь возможность получать извне набор параметров, через который возможно будет принять ваши опции.
    Ответ написан
    Комментировать
  • Как убрать отслеживание объекта при сохранении?

    @kttotto
    пофиг на чем писать
    Всего скорей, Вы руками создали объект routeSave с айдишником, который уже есть в базе и пытаетесь его добавить. Если Вы хотите изменить существующий объект, то его сначала надо получить, но только не вот так, как Вы это делаете
    .ToList()[0]
    а так
    _dbContext.Routes.FirstOrDefault(a => a ...
    Ответ написан
    Комментировать
  • Почему функция нестабильно читает файл?

    @kttotto
    пофиг на чем писать
    Запустите студию с правами администратора и проверьте, будет ли та же проблема. Если нет, значит дело в правах. Если будет, смотрите на размер файла, буфер, блокировку файла другими процессами, возможно делается одновременная попытка чтения из других потоков.
    Ответ написан
  • Как обновить данные, возвращаемые представлением в контроллер?

    @kttotto
    пофиг на чем писать
    Вам нужно изучить жизненный цикл ASP MVC, чтобы понять, что экземпляр контроллера живет ровно от запроса - до ответа. При каждом новом запросе создается новый экземпляр контроллера, это значит, что
    void ActionResult Index(Options options)
    {_options = options }

    смысла не имеет, при новом запросе _options будет пустой, даже если не будет параметра у конструктора.

    Если хотите сохранять какие то настройки через ActionResult Index(Options options), то заведите глобальный статический класс для хранения каких то параметров для всех запросов. Если эти настройки индивидуальны для каждого пользователя, то можно хранить их в сессиях.
    Ответ написан
    Комментировать
  • C#. Как правильно получить список файлов из папки в нужном порядке?

    @kttotto
    пофиг на чем писать
    То, как Вы видите файлы в папке, сортирует проводник и вовсе не говорит о том, как они хранятся или в каком порядке добавлялись в папку. Если хотите увидеть в том же порядке, что и в проводнике, то и результат сортируйте по тем же параметрам
    testFiles.OrderBy(f => f.Name)
    Ответ написан
    Комментировать
  • Как можно передать объект в JS скрипт?

    @kttotto
    пофиг на чем писать
    const traing = @JsonConvert.SerializeObject(traingObj)
    start(traing )
    Ответ написан
    Комментировать
  • Как правильно варить многопоточность на тасках?

    @kttotto
    пофиг на чем писать
    Вы ошибаетесь. У Вас нет параллельного выполнения задач в методе GetStatistic().
    Вот это count.Result равносильно
    count = db.Image.CountAsync().Result
    Это обычное синхронное выполнение.

    Вот так Task.WaitAll(count, notReady); Вы запустили задачи параллельно, но результат из них так не получите.
    Если в цикле хотите тело цикла выполнять в разных потоках, используйте Parallel.ForEach
    Ответ написан
    7 комментариев
  • Как обратиться к IWebDriver из другого класса?

    @kttotto
    пофиг на чем писать
    В этот другой класс передать ссылку на wd.
    Ответ написан
    Комментировать
  • Как парсить текст в CSV формате игнорируя запятые внутри кавычек и без сторонних библиотек?

    @kttotto
    пофиг на чем писать
    Можно примерно так
    data = new List<string>();
    parts = source.Split("\"");
    data.AddRange(parts.Where((x, index) => index % 2 != 0));
    data.AddRange(parts.Where((x, index) => index % 2 == 0).Split(","));
    result = string.Join(" | ", data.Where(x => !string.IsNullOrWhiteSpace(x));

    Но если будет три кавычки, то это может не сработать.
    Ответ написан
    2 комментария
  • Как найти в List несколько объектов без цикла?

    @kttotto
    пофиг на чем писать
    Подозреваю, что Вы хотите что-то подобное
    enemyPool
    	.Where(e => e.ParentRoomId == 0)
    	.Take(amount)
    	.ToList()
    	.ForEach(e => 
    	{
    		e.ParentRoomId = roomId;
    		e.GameObj.transform.position = spawnPosition.position;
    		e.GameObj.transform.rotation = spawnPosition.rotation;
    		e.GameObj.SetActive(true);
    	});

    Если уж совсем хотите с оптимизировать, то можно так
    count = 0;
    for(vat i = 0; i < enemyPool.Count; i++)
    {
    	if(enemyPool[i].ParentRoomId  == 0)
    	{
    		count ++;
    		if(count >= amount)
    			break;
    		enemyPool[i].ParentRoomId = roomId;
    		enemyPool[i].GameObj.transform.position = spawnPosition.position;
    		enemyPool[i].GameObj.transform.rotation = spawnPosition.rotation;
    		enemyPool[i].GameObj.SetActive(true);
    	}
    }
    Ответ написан
    5 комментариев
  • WebApi + Razor как это должно работать?

    @kttotto
    пофиг на чем писать
    Mvc на основе cshtml файлов генерит html и отдает его клиенту. Тоже самое можете делать Вы сами руками в WebApi приложении, используя RazorEngine.Templating.
    Вот ссылка на похожий вопрос.
    И прилагаю урезанный пример, который мы использовали у себя для генерации отчетов, я думаю разберетесь.
    spoiler
    public class RazorTemplateGenerator
    {
    	public void SetupReportTemplating(string baseDirectory = null)
    	{
    		var cfg = new TemplateServiceConfiguration
    		{
    			Debug = true
    		};
    
    		Engine.Razor = RazorEngineService.Create(cfg);
    
    		var folder = Path.Combine(baseDirectory ?? System.AppDomain.CurrentDomain.BaseDirectory, "Pages","PageTemplates");
    		var templates = Directory.GetFiles(folder, "*.cshtml");
    		foreach (var fName in templates)
    		{
    			var info = new FileInfo(fName);
    			var tName = Path.GetFileNameWithoutExtension(info.Name);
    			var template = File.ReadAllText(fName);
    			var src = new LoadedTemplateSource(template, fName.Replace(@"\bin",String.Empty));
    			Engine.Razor.AddTemplate(tName, src);
    		}
    	}
    
    	public void CheckCompile(string name)
    	{
    		Engine.Razor.Compile(name);
    	}
    
    	public string RenderPage(string viewName, object model)
    	{
    		return Engine.Razor.RunCompile(viewName, model.GetType(), model);
    	}
    }
    Ответ написан
    Комментировать
  • Игра змейка C#(Windows Forms), какую технологию выбрать для взаимодействия игроков по сети?

    @kttotto
    пофиг на чем писать
    Вот я бы tcp не рекомендовал. Вообще в большинстве многопользовательских играх tcp противопоказан, будете получать задержки, фризы. Поле у Вас будет одно на двоих и получите рассинхронизацию, что противник будет съедать яблоко, которое Вы уже съели.
    Используете upd протокол, по нему регулярно, раз в какой-то промежуток времени, получаете координаты всего списка змейки от противника и направление движения, а сами, ему же, транслируете свои. На своем экране, у змейки противника никакой логики, только отображение: отобразили все полученные координаты и двигаете ее в полученном направлении, пока не получили новые данные.
    Я когда то, как курсовую, сдавал тетрис по сети, только на wpf. Реализация была именно такая как описал. Игра была только в локалке, между компами, без всяких центральных серверов.
    Ответ написан
  • Как объявить массив такого типа в c#?

    @kttotto
    пофиг на чем писать
    Других способов, как char[][] - нет.
    Ответ написан
    1 комментарий
  • Есть ли смысл использовать byte, если в операция конвертирует в int??

    @kttotto
    пофиг на чем писать
    Уменьшать размеры переменных стоит только если Вы их будете где-то хранить в бд, на жестком и эти данные могут хорошо разрастить. Если же все работает в памяти, то действительно, нет смысла такой конвертации, для машины самый удобный тип для работы, это int, и большинство примитивных типов он неявно будет приводить к нему. Действительно, есть рекомендации не использовать без надобности типы shot, ushot и т.д., т.к. внутри они всеравно приводятся к int.

    В дополнение пара ссылок: сюда и сюда

    И цитата из них
    следует отметить, что в C # все арифметические выражения производятся на int. Это означает, что вам нужно будет увеличить число байтов до типа int, чтобы выполнить вычисления на них
    Ответ написан
    Комментировать