Не срабатывает таймер

180
29 декабря 2021, 22:20

Имеется сервис, который собирает данные и отправляет в другой сервис. Сервис работает в докер-контейнере

using Microsoft.Extensions.Hosting;
using NLog;
using System;
using System.Threading;
using System.Threading.Tasks;
public class KraulerHostedService : IHostedService, IDisposable
{
    private MyClass worker;
    private readonly Timer conditionTimer;
    private readonly Timer chartTimer;
    private bool stated = true;
    private readonly ILogger _logger;
    public KraulerHostedService()
    {
        _logger = LogManager.GetCurrentClassLogger();
        worker = new MyClass();
        conditionTimer = new Timer(ReciveConditions, null, Timeout.Infinite, Timeout.Infinite);
        chartTimer = new Timer(ReciveMessage, null, Timeout.Infinite, Timeout.Infinite);
    }
    public async Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.Info("Timed Background Service is starting.");
        worker.didntAuth += RepeatAuth;
        worker.ConditionsNoteSent += AddConditionInterval;
        worker.ConditionSent += ResetConditionInterval;
        worker.SetTimers += SetTimerForSendData;
        await worker.Auth().ConfigureAwait(false);
    }
    public async void RepeatAuth(object sender, EventArgs e)
    {
        _logger.Info("RepeatAuth");
        await worker.Autoresation().ConfigureAwait(false);
    }
    private async void ReciveConditions(object state)
    {
        _logger.Info("ReciveConditions");
        await worker.Conditions().ConfigureAwait(false);
    }
    private async void ReciveMessage(object state)
    {
        _logger.Info("ReciveMessage");
        await worker.SendDataMessage().ConfigureAwait(false);
    }
    private void SetTimerForSendData(object sender, EventArgs e)
    {
        _logger.Info("SetTimerForSendData");
        chartTimer.Change(1, TimeConsts.UpdateChartsTimeout);
        conditionTimer.Change(1, TimeConsts.ConditionTimeout);
        stated = true;
        _logger.Info("SetTimerForSendData Done");
    }
    public void AddConditionInterval(object sender, EventArgs e)
    {
        if (stated)
        {
            conditionTimer.Change(0, TimeConsts.UpdateChartsTimeout);
            stated = false;
            _logger.Info("AddConditionInterval");
        }
    }
    public void ResetConditionInterval(object sender, EventArgs e)
    {
        if (!stated)
        {
            conditionTimer.Change(0, TimeConsts.ConditionTimeout);
            stated = true;
            _logger.Info("ResetConditionInterval");
        }
    }
    public async Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.Info("Timed Background Service is stopping.");
        worker.Stop();
        conditionTimer.Change(Timeout.Infinite, Timeout.Infinite);
        chartTimer.Change(Timeout.Infinite, Timeout.Infinite);
    }
    public void Dispose()
    {
        _logger.Info("Dispose");
        worker.Dispose();
        conditionTimer.Dispose();
        chartTimer.Dispose();
    }
}

При тестировании сервиса на локальной машине всё работает как часы. Но когда я запускаю сервис на сервере, то получаю такие сообщения и больше ничего не происходит. Ощущение, что таймер просто не вызывается, хотя должен.

13:18:38|Info|Timed Background Service is starting.
13:18:38|Info|Main: Try to websocket connect
13:18:39|Info|Main: Websocket connection established!
13:18:39|Info|Worker auth
13:18:39|Info|SetTimerForSendData
13:18:39|Info|SetTimerForSendData Done

Больше я никаких сообщений, кроме внутренний от сокета о его состоянии не получаю

Вот dokerfile

FROM mcr.microsoft.com/dotnet/core/runtime:3.0.1-alpine3.10 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.0.101-alpine3.10 AS build
WORKDIR /src
COPY ["TestUnit/Test_Unit.csproj", "TestUnit/"]
COPY ["Worker/Worker.csproj", "Worker/"]
RUN dotnet restore "TestUnit/Test_Unit.csproj" --configfile TestUnit/NuGet.Config
COPY . .
WORKDIR "/src/TestUnit"
FROM build AS publish
RUN dotnet publish "Worker.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Worker.dll"]
READ ALSO
Как объединить две строки вместе в PHP?

Как объединить две строки вместе в PHP?

Необходимо создать два поля формы, чтобы в одно поле ввести, например, 1000 строк и во второе поле 1000 строк, нажать на кнопку "Выполнить"

98
PostgreSQL импорт из файла

PostgreSQL импорт из файла

Какой самый быстрый способ импортировать файл CSV в базу данных кроме COPYДанных очень много, около 125 млн записей

218
PHP код ревью участки повторяются

PHP код ревью участки повторяются

у меня есть такой вот рабочий код, ну кажется я сделал что-то не так, подскажите пожалуйста как можно улучшить качество кода:

237