private void AddTaskManager(InfoRequired info)
 {
     if (_taskManagers.Count > 0)
     {
         _taskManagers.Clear();
     }
     for (int i = 0; i < info.Thread; i++)
     {
         _taskManagers.Add(i + 1, new TaskManager());
     }
 }
        public async Task CheckBalanceAsyn(InfoRequired info)
        {
            StaticHomeModule.KillProcessByName("BvSsh");
            _taskManagers.Clear();
            cancelSources.Clear();

            AddTaskManager(info);
            var keyBag    = new ConcurrentBag <BtcKeys>(info.keys);
            var sshBag    = RenewSsh(info.SshFileSelected);
            var temKeyBag = keyBag.Count;

            temSshCount = StaticSsh.LoadListSshFromFile(info.SshFileSelected).Count;

            listKeyHaveMoney = new List <WithBalanceToSave>();
            listEmptyBalance = new List <EmptyBalanceToSave>();
            listErrorKey     = new List <ErrorKeyToSave>();
            await Task.Run(async() =>
            {
                int taskCancel = 0;
                var tasks      = new List <Task>();
                for (int i = 1; i <= info.Thread; i++)
                {
                    var _cancelSource = new CancellationTokenSource();
                    int taskId        = i;
                    Thread.Sleep(20);
                    var t = Task.Run(() =>
                    {
                        var temTask = taskId;
                        var manager = GetTaskManager(taskId);
                        try
                        {
                            manager.ChangeIp(sshBag);
                            OnProxyUsed(new ProxyUsedEventArg()
                            {
                                ProxyUsed = temSshCount - sshBag.Count,
                            });
                            while (!keyBag.IsEmpty) // >>>>>>>>>>
                            {
                                _cancelSource.Token.ThrowIfCancellationRequested();

                                OnKeyQueue(new KeyQueueEventArgs()
                                {
                                    KeyQueue = keyBag.Count,
                                });
                                OnKeyChecked(new KeyCheckedEventArgs()
                                {
                                    KeyChecked = temKeyBag - keyBag.Count,
                                });
                                if (keyBag.TryTake(out BtcKeys key))
                                {
                                    lock (o) { GetKeybalanceInfo(key, manager, sshBag, temSshCount); }
                                }
                            }
                        }
                        catch (OperationCanceledException)
                        {
                            taskCancel++;
                            OnTaskStop(new TaskStopEventArg()
                            {
                                ThreadNumber = taskCancel,
                                StopReason   = $"Stop Thread: "
                            });
                        }
                    }, _cancelSource.Token);
                    cancelSources.Add(_cancelSource);
                    tasks.Add(t);
                }
                await Task.WhenAll(tasks);
                if (taskCancel == info.Thread)
                {
                    return;
                }
                tasks.Clear();
                cancelSources.Clear();
            });
        }