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()"); }
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); } } }