/// <summary> /// 工作线程周期执行任务。 /// </summary> private async void ThreadWork() { while (Running) { // 获取目标任务 TTask task; try { task = await GetTaskAsync(); } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception ex) { OnTaskBuildFaulted(new TaskBuildFaultedEventArgs(new BackgroundTaskException("BackgroundTask build faulted.", ex))); // 使用空闲休眠时间休眠 TaskWaitHandle.WaitOne(TaskIdleTime); continue; } #pragma warning restore CA1031 // Do not catch general exception types if (null == task) { // 使用空闲休眠时间休眠 TaskWaitHandle.WaitOne(TaskIdleTime); continue; } // 定义任务执行完成事件参数 var taskExecutedArgs = new TaskExecutedEventArgs <TTask>(task); try { OnTaskExecuting(new TaskExecutingEventArgs <TTask>(task)); await ExecuteTaskAsync(task); } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception ex) { taskExecutedArgs.IsFaulted = true; taskExecutedArgs.Exception = new BackgroundTaskException(ex.Message, ex); } #pragma warning restore CA1031 // Do not catch general exception types finally { // 通知工作线程已执行完一轮任务。 taskExecutedArgs.CompletedTime = DateTime.Now; OnTaskExecuted(taskExecutedArgs); } // 工作线程周期信号量 TaskWaitHandle.WaitOne(TaskBusyTime); } TaskWaitHandle.Dispose(); TaskWaitHandle = null; // 通知工作线程已退出。 OnTaskThreadExited(new TaskThreadExitedEventArgs()); }
/// <summary> /// 停止工作线程。 /// </summary> /// <remarks> /// 如果工作线程已经为停止状态,该方法不做任何操作。 /// 如果在调用Stop方法停止工作线程时还有运行中的任务,工作线程会等待WaitExitMinute指定的超时分钟数。 /// </remarks> public void Stop() { if (Running == false) { return; } Running = false; if (TaskWaitHandle != null) { // 通知工作线程休眠信号量。 TaskWaitHandle.Set(); } }