public async Task Run(string[] args)
        {
            var runtimeParams = new RuntimeParams();

            CreatTrayIcon(runtimeParams);
            RegisterShortcut(runtimeParams);
            Config config = ParseConfig(args);

            await CaptureJob(config, runtimeParams);
        }
        private void CreatTrayIcon(RuntimeParams runtimeParams)
        {
            new Thread(
                () =>
            {
                var trayMenu = new ContextMenu();
                trayMenu.MenuItems.Add("Start", (_, __) => runtimeParams.Pause = false);
                trayMenu.MenuItems.Add("Pause", (_, __) => runtimeParams.Pause = true);
                trayMenu.MenuItems.Add("-");
                trayMenu.MenuItems.Add("Close", (_, __) => runtimeParams.Stop());
                var trayIcon = new NotifyIcon {
                    Icon = Utils.PlayIcon, ContextMenu = trayMenu, Visible = true
                };

                runtimeParams.TogglePause += (pause) => trayIcon.Icon = pause ? Utils.PauseIcon : Utils.PlayIcon;

                Application.Run();
            })
            {
                IsBackground = true
            }.Start();
        }
        private async Task CaptureJob(Config config, RuntimeParams runtimeParams)
        {
            try
            {
                var random = new Random(DateTime.Now.Millisecond);

                Capture(config);
                while (!runtimeParams.Stopped)
                {
                    var wait = random.Next(config.From, config.To) * 1000;
                    await Task.Delay(wait, runtimeParams.CancellationTokenSource.Token);

                    if (!runtimeParams.Pause)
                    {
                        Capture(config);
                    }
                }
            }
            catch (OperationCanceledException)
            {
                Console.WriteLine("Stopping.");
            }
        }
 private void RegisterShortcut(RuntimeParams runtimeParams) =>
 new KeyListener().onPress(PAUSE_SHORTCUT, () => runtimeParams.Pause = !runtimeParams.Pause);