예제 #1
0
        /// <summary>
        /// Worker task that will send pending messages.
        /// </summary>
        /// <param name="token"></param>
        private async Task WorkerProcAsync(CancellationToken token = default(CancellationToken))
        {
            var serviceType = typeof(T).FullName;

            _logger.Debug($"Begin WorkerProc - Service Type: {serviceType}");
            while (true)
            {
                if (token.IsCancellationRequested)
                {
                    token.ThrowIfCancellationRequested();
                }

                try
                {
                    _logger.Debug($"Start Sending Pending Messages - Service Type: {serviceType}");
                    await SendPendingMessages(token : token).ConfigureAwait(false);

                    _logger.Debug($"Finished Sending Pending Messages - Service Type: {serviceType}");
                }
                catch (OperationCanceledException)
                {
                    break;
                }
                catch (Exception ex)
                {
                    _logger.Error($"Retry failed - Service Type: {serviceType}", ex);
                }
                finally
                {
                    _logger.Debug($"End check: WorkerProc - Service Type: {serviceType}");
                }

                var timeToWait = Convert.ToInt32(_retryTimeSpan.TotalMilliseconds);
                _logger.Debug($"^^^^ Starting Wait Loop: timeToWait: {timeToWait} - Service Type: {serviceType}");

                _platformService.GetAvailableThreads(out var worker, out var completionPort);
                _logger.Debug($"1.............  Managed Thread Id {Environment.CurrentManagedThreadId}, WorkThreads {worker}, CompletionPortThreads {completionPort},  - Service Type: {serviceType}");

                while (timeToWait > 0)
                {
                    if (token.IsCancellationRequested)
                    {
                        _logger.Info($"Breaking loops because CanRun is false. Service Type: {serviceType}");
                        break;
                    }

                    try
                    {
                        _logger.Debug($"Starting Wait: timeToWait: {timeToWait} Thread ID: {Task.CurrentId.GetValueOrDefault()}, Managed Thread Id {Environment.CurrentManagedThreadId} - Service Type: {serviceType}");
                        await Task.Delay(5000, token).ConfigureAwait(false);

                        _platformService.GetAvailableThreads(out worker, out completionPort);
                        _logger.Debug($"2.............  Managed Thread Id {Environment.CurrentManagedThreadId}, WorkThreads {worker}, CompletionPortThreads {completionPort},  - Service Type: {serviceType}");
                        _logger.Debug($"Finished Waiting: timeToWait: {timeToWait} Thread ID: {Task.CurrentId.GetValueOrDefault()}, Managed Thread Id {Environment.CurrentManagedThreadId} - Service Type: {serviceType}");
                        timeToWait -= 5000;
                    }
                    catch (OperationCanceledException)
                    {
                        break;
                    }
                }

                _platformService.GetAvailableThreads(out worker, out completionPort);
                _logger.Debug($"3.............  Managed Thread Id {Environment.CurrentManagedThreadId}, WorkThreads {worker}, CompletionPortThreads {completionPort},  - Service Type: {serviceType}");
                _logger.Debug($"Finished wait loop. Service Type: {serviceType}");
            }

            _logger.Debug($"End WorkerProc - Service Type: {serviceType}");
        }