コード例 #1
0
 public void OnTaskFinished(long time, Dictionary <int, List <AlarmDataModel> > alarmsMemory)
 {
     TaskFinished?.Invoke(null, new TaskFinishedEventArgs()
     {
         ScanTimeMiliseconds = time, AlarmsMemory = alarmsMemory
     });
 }
コード例 #2
0
        private void IterateWorkflow(WorkflowRun <TWfContext> run)
        {
            if (_finish.Exists(precondition => precondition.Met(run.FinishedTasks)))
            {
                WorkflowFinished?.Invoke(this, new WorkflowEventArgs <TWfContext>(run.RunId, run.Context));
                return;
            }

            var tasksToExecute = _tasks.Where(kv => kv.Value.Met(run.FinishedTasks) && !run.HasFinished(kv.Key))
                                 .Select(kv => kv.Key).ToList();

            var anythingFinished = false;

            foreach (var task in tasksToExecute)
            {
                task.Action(run.Context);
                run.StartTask(task);
                TaskStarted?.Invoke(this, new WorkflowTaskEventArgs <TWfContext>(run.RunId, task.TaskId, run.Context));
                if (task.Autocomplete)
                {
                    TaskFinished?.Invoke(this,
                                         new WorkflowTaskEventArgs <TWfContext>(run.RunId, task.TaskId, run.Context));
                    run.FinishTask(task);
                    anythingFinished = true;
                }
            }

            if (anythingFinished)
            {
                IterateWorkflow(run);
            }
        }
コード例 #3
0
 static void GetFiles(string folder)
 {
     Mediator.AsyncThread = Thread.CurrentThread;
     Mediator.FilesList   = new List <string>();
     GetFilesRecurs(folder);
     TaskFinished?.Invoke(CurrentTask.SearchFiles);
 }
コード例 #4
0
        public void ConsumeMessage <TMessage>(TMessage message)
        {
            if (_startsOn.ContainsKey(typeof(TMessage)))
            {
                var run = new WorkflowRun <TWfContext>(
                    ((Func <TMessage, TWfContext>)_startsOn[typeof(TMessage)])(message));
                _runs.Add(run);
                WorkflowStarted?.Invoke(this, new WorkflowEventArgs <TWfContext>(run.RunId, run.Context));
                IterateWorkflow(run);
                return;
            }

            var runs          = _runs.ToArray();
            var tasksToFinish = _continuesOn.Where(kv => kv.Value == typeof(TMessage)).Select(kv => kv.Key);

            foreach (var workflowTask in tasksToFinish)
            {
                var messageBasedTask = (WorkflowTask <TWfContext, TMessage>)workflowTask;
                var runsToProcess    = runs.Where(r =>
                                                  (messageBasedTask).WorkflowRunSelector(r.Context, message))
                                       .Where(r => r.HasStarted(workflowTask));
                foreach (var run in runsToProcess)
                {
                    messageBasedTask.AfterMessageReceived?.Invoke(run.Context, message);
                    TaskFinished?.Invoke(this,
                                         new WorkflowTaskEventArgs <TWfContext>(run.RunId, workflowTask.TaskId, run.Context));
                    run.FinishTask(workflowTask);
                    IterateWorkflow(run);
                }
            }
        }
コード例 #5
0
        public void DoDetectedTask()
        {
            while (_taskList.Count > 0 && _startTime.AddMinutes(_taskList.ElementAt(0)._delay) <= FastClock.Instance.Time)
            {
                Task   task    = _taskList.ElementAt(0);
                string message = "";

                switch (task._orderType)
                {
                case OrderType.Order:
                    task._guest.AddArticle(task._article);
                    Task deliverTask = new Task(task._delay + task._article.TimeToBuild, task._guest, OrderType.Ready, task._article);
                    _taskList.Add(deliverTask);
                    _taskList.Sort();
                    message = task.ToString();
                    break;

                case OrderType.Ready:
                    message = task.ToString();
                    break;

                case OrderType.ToPay:
                    message = $"{task._guest.Name} pays {task._guest.Tab:f2}";
                    _guestList.Remove(task._guest.Name);
                    break;
                }
                _taskList.RemoveAt(0);
                TaskFinished?.Invoke(this, message);
            }
        }
コード例 #6
0
ファイル: Presenter.cs プロジェクト: HardenedHunter/Snapshot
        private void Task()
        {
            var tool      = new ToolHelp32();
            var processes = tool.GetProcesses().ToList();

            ContextProvider.Send(obj => TaskFinished?.Invoke(processes), null);
        }
コード例 #7
0
 public void FinishTask()
 {
     evt_taskFinished.Invoke(this);
     if (disablePlayerMovement)
     {
         GameManager.instance.EnablePlayerControl(true);
     }
 }
コード例 #8
0
        protected void OnTaskFinished(ITask task)
        {
            var eventArgs = new TaskFinishedEventArgs(
                task
                );

            TaskFinished?.Invoke(this, eventArgs);
        }
コード例 #9
0
        /// <summary>
        /// Executes the task.
        /// </summary>
        /// <param name="task">The task.</param>
        /// <exception cref="NotImplementedException"></exception>
        public void ExecuteTask(IEngineTask task)
        {
            // Check if task can be executed
            if (!task.CanBeExecuted())
            {
                task.AddMessage($"The task cannot be executed.", MessageSeverity.Error);
                if (task.ParentJob.FailIfAnyTaskHasError)
                {
                    throw new EngineException(logger, $"The task  cannot be executed. This job was aborted.");
                }
                else
                {
                    return;
                }
            }

            // Execute task
            if (TaskStarted != null)
            {
                TaskStarted.Invoke((Guid)task.EntityId, (Guid)task.InstanceID);
            }
            task.Start();

            // Stop task
            task.Stop();


            if (task.HasErrors)
            {
                task.AddMessage($"The task (instance: {task.InstanceID}) was not executed cause one or more errors occurs.", MessageSeverity.Error);
                if (task.ParentJob.FailIfAnyTaskHasError)
                {
                    if (TaskFinished != null)
                    {
                        TaskFinished.Invoke((Guid)task.EntityId, (Guid)task.InstanceID, false);
                    }

                    throw new EngineException(logger, $"The task (instance: {task.InstanceID}) was not executed cause one or more errors occurs. This job was aborted.");
                }
            }
            else if (task.HasWarnings)
            {
                task.AddMessage($"The task (instance: {task.InstanceID}) was executed but one or more warning occurs.", MessageSeverity.Warning);
                if (task.ParentJob.FailIfAnyTaskHasWarning)
                {
                    if (TaskFinished != null)
                    {
                        TaskFinished.Invoke((Guid)task.EntityId, (Guid)task.InstanceID, false);
                    }

                    throw new EngineException(logger, $"The task (instance: {task.InstanceID}) was executed but one or more warning occurs. This job was aborted.");
                }
            }
            if (TaskFinished != null)
            {
                TaskFinished.Invoke((Guid)task.EntityId, (Guid)task.InstanceID, true);
            }
        }
コード例 #10
0
 private static void ManagerDB_ProcDoneHandler()
 {
     _report = DbNotification.GetResultFromDb();
     ReportUpdated?.Invoke(_report);
     if (QMediator.IsAuto)
     {
         TaskFinished?.Invoke(QMediator.CurrentTaskName);
     }
 }
コード例 #11
0
 private void OnCurrentTaskFinished(AIBackupUnitTask task, bool aborted)
 {
     if (currentTask != null)
     {
         currentTask.Finished -= OnCurrentTaskFinished;
         TaskFinished?.Invoke(currentTask);
         currentTask = null;
     }
 }
コード例 #12
0
        /// <summary>
        /// Raise one of the events that is appropriate for the type of the BuildEventArgs
        /// </summary>
        public void Dispatch(BuildEventArgs buildEvent)
        {
            if (buildEvent is BuildMessageEventArgs)
            {
                MessageRaised?.Invoke(null, (BuildMessageEventArgs)buildEvent);
            }
            else if (buildEvent is TaskStartedEventArgs)
            {
                TaskStarted?.Invoke(null, (TaskStartedEventArgs)buildEvent);
            }
            else if (buildEvent is TaskFinishedEventArgs)
            {
                TaskFinished?.Invoke(null, (TaskFinishedEventArgs)buildEvent);
            }
            else if (buildEvent is TargetStartedEventArgs)
            {
                TargetStarted?.Invoke(null, (TargetStartedEventArgs)buildEvent);
            }
            else if (buildEvent is TargetFinishedEventArgs)
            {
                TargetFinished?.Invoke(null, (TargetFinishedEventArgs)buildEvent);
            }
            else if (buildEvent is ProjectStartedEventArgs)
            {
                ProjectStarted?.Invoke(null, (ProjectStartedEventArgs)buildEvent);
            }
            else if (buildEvent is ProjectFinishedEventArgs)
            {
                ProjectFinished?.Invoke(null, (ProjectFinishedEventArgs)buildEvent);
            }
            else if (buildEvent is BuildStartedEventArgs)
            {
                BuildStarted?.Invoke(null, (BuildStartedEventArgs)buildEvent);
            }
            else if (buildEvent is BuildFinishedEventArgs)
            {
                BuildFinished?.Invoke(null, (BuildFinishedEventArgs)buildEvent);
            }
            else if (buildEvent is CustomBuildEventArgs)
            {
                CustomEventRaised?.Invoke(null, (CustomBuildEventArgs)buildEvent);
            }
            else if (buildEvent is BuildStatusEventArgs)
            {
                StatusEventRaised?.Invoke(null, (BuildStatusEventArgs)buildEvent);
            }
            else if (buildEvent is BuildWarningEventArgs)
            {
                WarningRaised?.Invoke(null, (BuildWarningEventArgs)buildEvent);
            }
            else if (buildEvent is BuildErrorEventArgs)
            {
                ErrorRaised?.Invoke(null, (BuildErrorEventArgs)buildEvent);
            }

            AnyEventRaised?.Invoke(null, buildEvent);
        }
コード例 #13
0
        private TResult EventWrapper()
        {
            var result = _func?.Invoke();

            TaskFinished?.Invoke(this, new TaskWrapperEventArgs <TResult>()
            {
                Result = result
            });
            return(result);
        }
コード例 #14
0
 public void OnTaskFinished(EventArgs args)
 {
     groupBoxReadMode.Enabled = true;
     groupBoxSettings.Enabled = true;
     groupBoxTemp.Enabled     = true;
     buttonAbort.Enabled      = false;
     buttonPause.Enabled      = false;
     buttonSave.Enabled       = true;
     TaskFinished?.Invoke(this, args);
 }
コード例 #15
0
ファイル: ManagerFS.cs プロジェクト: fil-dv/QuickUp
 private static void UpdateReport()
 {
     try
     {
         _report = ReadLog();
         ReportUpdated?.Invoke(_report);
         TaskFinished?.Invoke(TaskName.AdrSplit);
     }
     catch (Exception ex)
     {
         ExceptionHandler("UpdateReport()", ex.Message);
     }
 }
コード例 #16
0
        private StatusCode doExec(string parameter)
        {
            StatusCode retVal;

            try
            {
                try
                {
                    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))
                    {
                        retVal = OnExec(parameter ?? TaskDataParameter);
                    }
                    if (retVal.IsSucceeded)
                    {
                        Notify("[Task] " + this.CurrentTaskInfo.description + " Done");
                    }
                }
                catch (Exception ex)
                {
                    retVal =
                        new CommonStatusCode(CommonStatusCode.TASK_EXECUTION_FAILED, new object[] { ApplicationID, TaskInfoID, TaskDataParameter, TaskDataID }, ex, Config, ApplicationID);
                }
                //Create new Instance
                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    if (!retVal.IsSucceeded)
                    {
                        StatusCode retVal2 = createNewInstance(parameter, STATUS_FAIL, null, retVal, null);
                        if (retVal2.IsSucceeded)
                        {
                            retVal = retVal2;
                        }
                    }
                    else
                    {
                        retVal =
                            createNewInstance(parameter, STATUS_COMPLETE,
                                              null, null, null);
                    }
                    scope.Complete();
                }
            }
            catch (Exception ex2)
            {
                retVal =
                    new CommonStatusCode(CommonStatusCode.TASK_LIBRARY_INTERNAL_ERROR, new object[] { ApplicationID, TaskInfoID, TaskDataParameter, TaskDataID }, ex2, Config, ApplicationID);
            }
            TaskFinished?.Invoke(this, null);
            return(retVal);
        }
コード例 #17
0
 private void _on_task_finished(object sender, EventArgs e)
 {
     lock (_external_lock)
     {
         if (_auto_start && _queue_data.Count > _pool_size)
         {
             _queue_data.ElementAt(_pool_size).Value.Start();
         }
         _queue_data.Remove((int)((Downloader)sender).Tag);
         _set_speed();
     }
     try { TaskFinished?.Invoke(sender, e); }
     catch { }
 }
コード例 #18
0
        static void ReplaceText()
        {
            int count = 0;

            foreach (var item in Mediator.FilesList)
            {
                string oldText = File.ReadAllText(item, Encoding.Default);
                if (oldText.Contains(Mediator.Search))
                {
                    string newText = oldText.Replace(Mediator.Search, Mediator.Replace);
                    File.WriteAllText(item, newText, Encoding.Default);
                    count++;
                }
            }
            Mediator.UpdatedFiles = count;
            TaskFinished?.Invoke(CurrentTask.ReplaceText);
        }
コード例 #19
0
 private void _on_task_finished(object sender, EventArgs e)
 {
     lock (_external_lock)
     {
         if (_auto_start && _queue_data.Count > _pool_size)
         {
             _queue_data.ElementAt(_pool_size).Value.Start();
         }
         _queue_data.Remove((int)((Uploader)sender).Tag);
         //System.Threading.ThreadPool.QueueUserWorkItem(delegate
         //{
         //    ((Uploader)sender).Dispose();
         //});
         _set_speed();
     }
     try { TaskFinished?.Invoke(sender, e); }
     catch { }
 }
コード例 #20
0
        void CreateBackUp()
        {
            string str = ManagerDB.CreateBackUp(BackUpName);

            if (str.Length < 1)
            {
                BackUpReport = "Таблица не создана.";
            }
            else
            {
                BackUpReport = "Таблица успешно создана. Количество записей - " + str;
            }

            QLoger.AddRecordToLog(BackUpName + "\t" + BackUpReport);
            if (QMediator.IsAuto)
            {
                TaskFinished?.Invoke(TaskName.BackUp);
            }
        }
コード例 #21
0
        /// <summary>
        /// Kellner führt Task aus, falls etwas zu tun ist.
        /// </summary>
        public void DoTasks()
        {
            //Gibt es was zu tun?
            while (_tasks.Count > 0 &&
                   _startTime.AddMinutes(_tasks.ElementAt(0).Delay) <= FastClock.Instance.Time)
            {
                Task task = _tasks.ElementAt(0);
                //Tasks ausführen
                _tasks.RemoveAt(0);
                string message = "";
                switch (task.TaskType)
                {
                case TaskType.Order:
                    task.Guest.OrderArticle(task.Article);
                    Task deliverTask = new Task(TaskType.Deliver, task.Delay + task.Article.TimeToBuild,
                                                task.Guest, task.Article);
                    _tasks.Add(deliverTask);
                    _tasks.Sort();     // damit die Auslieferung entsprechend der Zeit eingefügt wird
                    Debug.WriteLine(task);
                    message = task.ToString();
                    break;

                case TaskType.Deliver:
                    Debug.WriteLine(task);
                    message = task.ToString();
                    break;

                case TaskType.Pay:
                    double sum = task.Guest.CalculateSumOfOrders();
                    message = $"Pay\t{task.Guest.Name} \t {sum:f2}";
                    Debug.WriteLine(message);
                    _guests.Remove(task.Guest.Name);
                    break;
                }
                TaskFinished?.Invoke(this, message);
            }
            //// Rekursiver Aufruf der Taskbearbeitung bis in dieser Minute keine Aufträge anstehen.
            //DoTasks();
        }
コード例 #22
0
        public virtual void Update(GameTime gameTime)
        {
            if (!Stopped)
            {
                timespan++;
                if (timespan >= interval)
                {
                    timespan = 0;
                    if (index + 1 >= length)
                    {
                        Finished = true;
                    }
                    else
                    {
                        index++;
                    }
                }
            }

            if (Finished)
            {
                TaskFinished?.Invoke(this);
            }
        }
コード例 #23
0
 private void CheckRefreshResult(JRCtler.JsonRpcRes e)//检查Refresh方法中异步返回的结果
 {
     foreach (dynamic s in e.Result)
     {
         JRCtler.JsonRpcRes a = new JRCtler.JsonRpcRes
         {
             Result = s
         };
         string g = a.Result.gid;
         if (GidList.Contains(g) != true)
         {
             GidList.Add(g);
             string Status = a.Result.status;
             if (Status != "complete")
             {
                 Add(new TaskLite(a));
             }
             else
             {
                 TaskFinished?.Invoke(new TaskLite(a));
             }
         }
     }
 }
コード例 #24
0
 private void FireTaskFinished()
 {
     TaskFinished?.Invoke(this, EventArgs.Empty);
 }
コード例 #25
0
 /// <summary>
 /// Use this method to finish effect, rather than turning <see cref="Finished"/> variable to true.
 /// </summary>
 public virtual void Finish()
 {
     Finished = true; TaskFinished?.Invoke(this);
 }
コード例 #26
0
 private void OnTaskFinished()
 {
     this.IsComplete = true;
     TaskFinished?.Invoke(this, null);
 }
コード例 #27
0
        private void InformationRefresh(JRCtler.JsonRpcRes e)
        {
            //计算当前下载速度
            double SpeedLong = e.Result.downloadSpeed;

            if (SpeedLong / 1024 == 0)
            {
                Speed = Math.Round(SpeedLong, 2).ToString() + "B/S";
            }
            else if (SpeedLong / 1048576 == 0)
            {
                Speed = Math.Round((SpeedLong / 1024), 2).ToString() + "KB/S";
            }
            else
            {
                Speed = Math.Round((SpeedLong / 1048578), 2).ToString() + "MB/S";
            }
            OnPropertyChanged("Speed");

            //更新状态
            string NewStatus = e.Result.status;

            if (Status != NewStatus)
            {
                Status = NewStatus;
                switch (Status)
                {
                case "active":
                    State = "none";
                    break;

                case "waiting":
                    State          = "wait";
                    OughtToRefresh = 5;
                    break;

                case "paused":
                    State          = "wait";
                    OughtToRefresh = 5;
                    break;

                case "error":
                    State          = "error";
                    OughtToRefresh = 10;
                    break;

                case "complete":
                    State = "none";
                    TaskFinished?.Invoke(this);
                    OughtToRefresh = 10;
                    break;

                case "removed":
                    State          = "error";
                    OughtToRefresh = 10;
                    break;

                default:
                    State          = "wait";
                    OughtToRefresh = 5;
                    break;
                }
                OnPropertyChanged("State");
            }

            //更新进度
            string CompletedNew = e.Result.completedLength;

            Total = e.Result.totalLength;
            if (CompletedNew != Completed)
            {
                Completed = CompletedNew;
                OnPropertyChanged("Progress");
            }
            else if (CompletedNew == "0")
            {
                State = "wait";
                OnPropertyChanged("State");
            }

            Gid = e.Result.gid;
            if (FileName == null || FileNameSource != FileNameSources.Path)
            {
                GetFileInfo();
            }
            e = null;
        }
コード例 #28
0
ファイル: ManagerFS.cs プロジェクト: fil-dv/QuickUp
        public static void ProgsToExec(ExecProgsType taskName)
        {
            try
            {
                _report = "Выполнение программ...\n\n";
                ReportUpdated?.Invoke(_report);
                if (QMediator.PathToProgDest != null)
                {
                    string str;
                    if (taskName == ExecProgsType.Oktel)
                    {
                        str = "\\post!\\oktel";
                        QMediator.CurrentTaskName = TaskName.Oktel;
                        DbNotification.ResultWaiter();
                    }
                    else
                    {
                        str = taskName == ExecProgsType.PredProgs ? "\\!pred" : "\\post!";
                    }

                    string path = QMediator.PathToProgDest + str;
                    if (!new DirectoryInfo(path).Exists)
                    {
                        Directory.CreateDirectory(path);
                        _report = "Нет программ для выполнения.";
                    }
                    else
                    {
                        List <string> filePathList = GetFilesForExec(path);
                        if (filePathList.Count < 1)
                        {
                            _report = "Нет программ для выполнения.";
                            ReportUpdated?.Invoke(_report);

                            if (taskName == ExecProgsType.PredProgs)
                            {
                                TaskFinished?.Invoke(TaskName.PredProgs);
                            }
                            else if (taskName == ExecProgsType.PostProgs)
                            {
                                TaskFinished?.Invoke(TaskName.PostProgs);
                            }
                            else
                            {
                                TaskFinished?.Invoke(TaskName.Oktel);
                            }

                            return;
                        }
                        foreach (var item in filePathList)
                        {
                            _report += Environment.NewLine + "Файл:\t\t" + item;
                            bool   isOk     = true;
                            string fileText = File.ReadAllText(item, Encoding.Default);
                            try
                            {
                                if (fileText.ToLower().Contains("begin"))
                                {
                                    ManagerDB.ExecCommand(fileText);
                                }
                                else
                                {
                                    isOk = SplitAndExec(fileText);
                                }
                            }
                            catch (Exception ex)
                            {
                                isOk = false;
                                ExceptionHandler("ProgsToExec()", ex.Message);
                            }
                            _report += ("\t" + (isOk == true ? "отработал нормально." : "отработал с ошибками.") + Environment.NewLine);
                        }
                    }
                }
                else
                {
                    _report = "Не определен путь к программам.";
                }

                ReportUpdated?.Invoke(_report);
                if (taskName == ExecProgsType.PredProgs)
                {
                    TaskFinished?.Invoke(TaskName.PredProgs);
                }
                else if (taskName == ExecProgsType.PostProgs)
                {
                    TaskFinished?.Invoke(TaskName.PostProgs);
                }
                else
                {
                    TaskFinished?.Invoke(TaskName.Oktel);
                }
            }
            catch (Exception ex)
            {
                ExceptionHandler("ProgsToExec()", ex.Message);
            }
        }
コード例 #29
0
 // ReSharper disable once UnusedMember.Local
 private void OnTaskFinished(TaskFinishedEventArgs e)
 {
     TaskFinished?.Invoke(this, e);
 }
コード例 #30
0
        //RAM stream -> File stream
        private void _monitor_thread_callback()
        {
            //设置线程启动相关变量
            _monitor_thread_created.Set();
            _start_time = DateTime.Now;
            //管理任务状态
            bool pause_to_start = false;

            lock (_thread_flag_lock)
            {
                pause_to_start        = ((_download_thread_flag & 0xffffff) & (_DOWNLOAD_THREAD_FLAG_PAUSED | _DOWNLOAD_THREAD_FLAG_PAUSE_REQUESTED)) != 0;
                _download_thread_flag = (_download_thread_flag | _DOWNLOAD_THREAD_FLAG_STARTED) & ~_DOWNLOAD_THREAD_FLAG_START_REQUESTED;
                if (pause_to_start)
                {
                    _download_thread_flag = (_download_thread_flag & ~_DOWNLOAD_THREAD_FLAG_PAUSED);
                }
            }
            //缓存最大线程数,避免中途更改
            var max_thread = _max_thread;

            //预分配空间(todo:改为set-length,提高效率)
            _downloaded_size = 0;
            try { PreAllocBlockStarted?.Invoke(this, new EventArgs()); } catch { }
            if (_file_stream.Length != (long)_data.Size)
            {
                if (_file_stream.Length > (long)_data.Size)
                {
                    _file_stream.SetLength((long)_data.Size); //文件长度大于预分配长度,直接截断
                }
                else
                {
                    //从当前长度开始按0填充
                    _file_stream.Seek(0, SeekOrigin.End);
                    _downloaded_size = _file_stream.Length;
                    var  blank_buffer = new byte[_MIN_IO_FLUSH_DATA_LENGTH];
                    long write_length = 0;
                    do
                    {
                        write_length = (long)_data.Size - _file_stream.Length;
                        int len = (int)Math.Min(_MIN_IO_FLUSH_DATA_LENGTH, write_length);
                        _file_stream.Write(blank_buffer, 0, len);
                        _downloaded_size += len;
                    } while (write_length > 0 && ((_download_thread_flag & 0xffffff) & (_DOWNLOAD_THREAD_FLAG_PAUSE_REQUESTED | _DOWNLOAD_THREAD_FLAG_STOP_REQUESTED)) == 0);
                }
                _file_stream.Seek(0, SeekOrigin.Begin);
            }
            try { PreAllocBlockFinished?.Invoke(this, new EventArgs()); } catch { }
            _downloaded_size = 0;

            //分配多线程的变量数组
            _guid_list        = new Guid[max_thread];
            _last_receive     = new DateTime[max_thread];
            _buffer_stream    = new QueueStream[max_thread];
            _thread_data_lock = new object[max_thread];
            _request          = new NetStream[max_thread];
            _position         = new ulong[max_thread];
            _io_position      = new long[max_thread];
            for (int i = 0; i < max_thread; i++)
            {
                _buffer_stream[i]     = new QueueStream();
                _thread_data_lock[i]  = new object();
                _request[i]           = new NetStream();
                _request[i].CookieKey = _cookie_key;
            }

            var buffer         = new byte[_MIN_IO_FLUSH_DATA_LENGTH];
            var next_loop_time = DateTime.Now.AddSeconds(1);

            //监控循环
            #region monitor loop
            while (true)
            {
                //当url的有效时间已过时,刷新url
                if (_url_expire_time < DateTime.Now)
                {
                    _url_expire_time         = _url_expire_time.AddSeconds(30);
                    _url_fail_to_fetch_count = 0;
                    _api.GetAccount(_data.AccountID).GetLocateDownloadLinkAsync(_data.Path, _main_url_refresh_callback);
                }

                //管理任务标识
                #region thread flag handling
                bool ispause = false, iscancel = false;

                if (((_download_thread_flag & 0xffffff) & _DOWNLOAD_THREAD_FLAG_PAUSE_REQUESTED) != 0)
                {
                    ispause = true;
                }
                if (((_download_thread_flag & 0xffffff) & _DOWNLOAD_THREAD_FLAG_STOP_REQUESTED) != 0)
                {
                    iscancel = true;
                }

                if (ispause)
                {
                    //pause event
                    for (int i = 0; i < _request.Length; i++)
                    {
                        lock (_thread_data_lock[i])
                        {
                            _request[i].Close();
                            if (_guid_list[i] != Guid.Empty)
                            {
                                _dispatcher.ReleaseTask(_guid_list[i]);
                                _guid_list[i] = Guid.Empty;
                            }
                            //flushing buffer stream
                            if ((_guid_list[i] == Guid.Empty && _buffer_stream[i].Length > 0) || (_buffer_stream[i].Length > _MIN_IO_FLUSH_DATA_LENGTH))
                            {
                                _file_stream.Seek(_io_position[i], SeekOrigin.Begin);
                                while ((_guid_list[i] == Guid.Empty && _buffer_stream[i].Length > 0) || (_buffer_stream[i].Length > _MIN_IO_FLUSH_DATA_LENGTH))
                                {
                                    int rc = _buffer_stream[i].Read(buffer, 0, _MIN_IO_FLUSH_DATA_LENGTH);
                                    _file_stream.Write(buffer, 0, rc);
                                    _io_position[i] += rc;
                                }
                            }
                        }

                        _file_stream.Flush();
                    }
                    _request              = null;
                    _urls                 = null;
                    _guid_list            = null;
                    _last_receive         = null;
                    _position             = null;
                    _thread_data_lock     = null;
                    _monitor_thread       = null;
                    _end_time             = DateTime.Now;
                    _download_thread_flag = (_download_thread_flag | _DOWNLOAD_THREAD_FLAG_PAUSED) & ~(_DOWNLOAD_THREAD_FLAG_PAUSE_REQUESTED | _DOWNLOAD_THREAD_FLAG_STARTED);
                    return;
                }
                if (iscancel)
                {
                    //cancel event
                    _file_stream.Close();
                    for (int i = 0; i < _request.Length; i++)
                    {
                        lock (_thread_data_lock[i])
                        {
                            _request[i].Close();
                            if (_guid_list[i] != Guid.Empty)
                            {
                                _dispatcher.ReleaseTask(_guid_list[i]);
                                _guid_list[i] = Guid.Empty;
                            }
                        }
                    }
                    _request          = null;
                    _urls             = null;
                    _guid_list        = null;
                    _last_receive     = null;
                    _position         = null;
                    _thread_data_lock = null;
                    _file_stream.Dispose();
                    _file_stream          = null;
                    _monitor_thread       = null;
                    _end_time             = DateTime.Now;
                    _download_thread_flag = (_download_thread_flag | _DOWNLOAD_THREAD_FLAG_STOPPED) & ~(_DOWNLOAD_THREAD_FLAG_STOP_REQUESTED | _DOWNLOAD_THREAD_FLAG_STARTED);
                    return;
                }
                #endregion

                //url合理检测
                if (_urls == null || _urls.Length == 0)
                {
                    Thread.Sleep(100);
                    continue;
                }

                int started_tasks = 0;
                for (int i = 0; i < _request.Length; i++)
                {
                    lock (_thread_data_lock[i])
                    {
                        //将内存的缓存数据流写入到硬盘中
                        if ((_guid_list[i] == Guid.Empty && _buffer_stream[i].Length > 0) || (_buffer_stream[i].Length > _MIN_IO_FLUSH_DATA_LENGTH))
                        {
                            _file_stream.Seek(_io_position[i], SeekOrigin.Begin);
                            while ((_guid_list[i] == Guid.Empty && _buffer_stream[i].Length > 0) || (_buffer_stream[i].Length > _MIN_IO_FLUSH_DATA_LENGTH))
                            {
                                int rc = _buffer_stream[i].Read(buffer, 0, _MIN_IO_FLUSH_DATA_LENGTH);
                                _file_stream.Write(buffer, 0, rc);
                                _io_position[i] += rc;
                            }
                        }

                        //检测任务分配状态,自动开始新的分段下载
                        if (_guid_list[i] == Guid.Empty && (DateTime.Now - _last_receive[i]).TotalSeconds > 3.0)
                        {
                            if (started_tasks < _PARALLEL_START_REQUEST_COUNT)
                            {
                                _guid_list[i] = _dispatcher.AllocateNewTask(out _position[i]);
                                if (_guid_list[i] != Guid.Empty)
                                {
                                    _last_receive[i] = DateTime.Now;
                                    try
                                    {
                                        _request[i].UserAgent = "netdisk;5.7.2.3;PC;PC-Windows;10.0.16299;WindowsBaiduYunGuanJia";
                                        _request[i].HttpGetAsync(_urls[i % _urls.Length], _data_transfer_callback, new _temp_strcut {
                                            id = _guid_list[i], index = i
                                        }, range: (long)_position[i]);
                                        _io_position[i] = (long)_position[i];
                                    }
                                    catch { }

                                    started_tasks++;
                                }
                            }
                        }

                        //自动中断超时的请求
                        else if (_guid_list[i] != Guid.Empty && (DateTime.Now - _last_receive[i]).TotalSeconds > 35.0)
                        {
                            _request[i].Close();
                            _request[i] = new NetStream();
                            _dispatcher.ReleaseTask(_guid_list[i]);
                            _guid_list[i] = Guid.Empty;
                        }
                    }
                }

                _current_bytes = 0;

                //更新速度
                var cur_len = _dispatcher.CompletedLength;
                _last_5s_length.RemoveFirst();
                _last_5s_length.AddLast(cur_len);

                _average_speed_total = cur_len / (DateTime.Now - _start_time).TotalSeconds;
                _average_speed_5s    = (_last_5s_length.Last.Value - _last_5s_length.First.Value) / 5.0;
                _downloaded_size     = (long)cur_len;
                Tracer.GlobalTracer.TraceInfo("Downloading: " + cur_len + "/" + _data.Size + " [" + (_average_speed_5s / 1024).ToString("0.00") + "KB/s]");

                if (cur_len == _data.Size)
                {
                    break;
                }
                //时钟控制(1s)
                var ts = (next_loop_time - DateTime.Now).TotalMilliseconds;
                next_loop_time = next_loop_time.AddSeconds(1);
                if (ts >= 1.0)
                {
                    Thread.Sleep((int)ts);
                }
            }
            #endregion

            //下载完成
            _file_stream.Close();
            for (int i = 0; i < _request.Length; i++)
            {
                lock (_thread_data_lock[i])
                {
                    _request[i].Close();
                }
            }
            _request          = null;
            _urls             = null;
            _guid_list        = null;
            _last_receive     = null;
            _position         = null;
            _thread_data_lock = null;
            _file_stream.Dispose();
            _file_stream    = null;
            _monitor_thread = null;
            _end_time       = DateTime.Now;

            //文件解密
            if (_data.Path.EndsWith(".bcsd"))
            {
                _download_thread_flag |= _DOWNLOAD_THREAD_FLAG_DECRYPTING;
                try { DecryptStarted?.Invoke(this, new EventArgs()); } catch { }
                _decrypt_file();
                _download_thread_flag = _download_thread_flag & ~_DOWNLOAD_THREAD_FLAG_DECRYPTING;
                try { DecryptFinished?.Invoke(this, new EventArgs()); } catch { }
            }
            _download_thread_flag = (_download_thread_flag | _DOWNLOAD_THREAD_FLAG_FINISHED) & ~_DOWNLOAD_THREAD_FLAG_STARTED;

            try { TaskFinished?.Invoke(this, new EventArgs()); }
            catch { }
        }