Задать вопрос
Ответы пользователя по тегу C#
  • Передача сообщения через SignalR. Как сделать однократное соединение с сервером?

    Lapish72
    @Lapish72
    Нет примера вызова методов из вашего класса, но могу предположить, что вы каждый раз инициализируете его. Вам нужно сделать ваш класс Singleton'ом. Для этого в Startup ConfigureServices зарегистрируйте ваш сервис:
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<ВашСервис>();
        }
    }

    И затем в Program:
    public class Program
    {
        public static async Task Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();
            var service = host.Services.GetRequiredService<ВашСервис>();
            service.ConnectToServer(); //Подключаемся к SignalR
    
            host.Run();
        }
    }


    UPD:
    Советую поменять название класса на более общее, например, SignalrService, а метод SendToSignalR на Connect.
    Ответ написан
    6 комментариев
  • Какие технологии и подходы использовать?

    Lapish72
    @Lapish72
    Как вы заметили при вашем подходе, например, 10 компьютеров при тайминге опроса 1с отправят как минимум 36к запросов к базе за 1час. 1 день 864к строк+ Это если вам нужно хранить супер подробную статистику.

    Как бы сделал я:
    Данные отправляются не напрямую в бд, а в какой-то промежуточный сервис, который к примеру будет анализировать данные за 1 час или 24ч, проводить с ними манипуляции(большинство данных удалять, а остаток перекладывать в другую таблицу для менее детальных отчетов). Из тех же +/- 3600 строк от одного компьютера можно оставить 4 по среднему значению за 15 минут. Экономия ресурсов в 900 раз.

    UPD:
    Если поставить периода "чистки" базы 2ч, то в приложении мы можем показать нагрузку как посекундно, ведь не удалились еще полные данные, так и более детально для данных >1ч.
    Ответ написан
    1 комментарий
  • Как отключать ContextMenu на дочерних элементах?

    Lapish72
    @Lapish72 Автор вопроса
    UserControl.xaml
    <UserControl.Resources>
        <ContextMenu x:Key="AmazingMenu">
            <MenuItem Header="Item1"/>
            <MenuItem Header="Item2"/>
        </ContextMenu>
    </UserControl.Resources>
    
    <Grid x:Name="MegaGrid" Background="Transparent" MouseRightButtonDown="Grid_MouseRightButtonDown">
        <!-- Some controls -->
    </Grid>


    UserControl.xaml.cs
    private void Grid_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        var control = e.OriginalSource as Grid;
    
        if (control.Name.Equals("MegaGrid"))
        {
            MegaGrid.ContextMenu = FindResource("AmazingMenu") as ContextMenu;
        }
        else
        {
            MegaGrid.ContextMenu = null;
        }
    }
    Ответ написан
    Комментировать