示例#1
0
        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
        }
示例#2
0
 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);
 }