示例#1
0
        private void Downloaded(string downTaskId)
        {
            //ConsumeTotal++;
            TriggerTaskItem taskItem = null;

            _downloadTaskCollection.TryRemove(downTaskId, out taskItem);

            //_downloadTaskCount--
            //Interlocked.Add(ref _downloadingTaskCount, -1);
            _messagePullAutoResetEvent.Set();
            //Logger.Debug($"eventLock.Set()");
        }
示例#2
0
        private void PullMessage()
        {
            while (true)
            {
                if (_stopPull)
                {
                    break;
                }
                if (!_first)
                {
                    if (_messagePullAutoResetEvent.WaitOne())
                    {
                        _first = false;
                    }
                }

                var downloadingTaskCount = DownloadingTaskCount();
                Logger.Debug($"Count:downing={downloadingTaskCount}, Max DownThead={_maxDownloadThreadNumber}");
                if (_pulling || downloadingTaskCount >= _maxDownloadThreadNumber)
                {
                    var threadDown = _messagePullAutoResetEvent.Reset();
                    _messagePullAutoResetEvent.WaitOne();
                    Logger.Debug($"DowningThread:{threadDown}=eventLock.Reset()");
                    continue;
                }

                //Thread.Sleep(10);

                var num      = _maxDownloadThreadNumber - DownloadingTaskCount();
                var messages = _context.Scheduler.Poll(num);

                if (messages == null || !messages.Any())
                {
                    var message = _context.Scheduler.WaitUntillPoll();
                    messages.Add(message);
                    Logger.Debug(message.Request.Url);
                }
                //_messagePullAutoResetEvent.Reset();


                foreach (var item in messages)
                {
                    var cancelTokenSource = new CancellationTokenSource();
                    var token             = cancelTokenSource.Token;
                    var downloadTask      = Task.Factory.StartNew(async(state) => {
                        var taskState = state as DownloadTaskState;
                        if (taskState == null)
                        {
                            cancelTokenSource.Cancel();
                        }
                        token.ThrowIfCancellationRequested();
                        //Thread.Sleep(10);
                        await WorkingAsync(taskState.Request, token);
                    },
                                                                  new DownloadTaskState()
                    {
                        Context = _context, Request = item.Request
                    },
                                                                  token
                                                                  );

                    //downloadTask.ContinueWith(t => {
                    //    Downloaded(item.Request.Id);
                    //});

                    var taskItem = new TriggerTaskItem()
                    {
                        Id = item.Request.Id,
                        CancelTokenSource = cancelTokenSource,
                        DownloadTask      = downloadTask
                    };

                    _downloadTaskCollection.TryAdd(taskItem.Id, taskItem);
                }
            }
        }