protected void RunTask() { #region 创造主线程,去分配多个下载线程 _tokenSource = new CancellationTokenSource(); var token = _tokenSource.Token; Task.Factory.StartNew(() => { while (!token.IsCancellationRequested) { #region 创建执行下载的线程数组 var items = UrlProvider.GetItems(Option.MaxCount); var tasksLength = items.Count; var tasks = new Task[tasksLength]; for (var i = 0; i < tasksLength; i++) { var item = items[i]; UrlProvider.UpdateItem(item, UriStatus.DOING); tasks[i] = new Task(() => { try { // TODO 执行具体规则 RunTaskAsync(item).GetAwaiter().GetResult(); } catch (Exception ex) { var error = $"{item.Source}, {ex.Message},{ex.TargetSite}"; Debug.WriteLine(error); Logger?.Error(error); UrlProvider.UpdateItem(item, UriStatus.ERROR); } }); } #endregion #region 监视线程数组完成 var continuation = Task.Factory.ContinueWhenAll(tasks, (task) => { }, token); foreach (var task in tasks) { task.Start(); } while (!continuation.IsCompleted) { Thread.Sleep(1000); } #endregion if (UrlProvider.HasMore) { continue; } _tokenSource.Cancel(); InvokeEvent("done"); Paused = true; PausedChanged?.Invoke(Paused); break; } }, token); #endregion }
private async void RunSingleTask() { while (UrlProvider.HasMore) { var items = UrlProvider.GetItems(1); if (items == null) { break; } if (Paused) { break; } foreach (var item in items) { await RunTaskAsync(item); } } if (!Paused) { InvokeEvent("done"); } Paused = true; PausedChanged?.Invoke(Paused); }