Имеется сервис, который собирает данные и отправляет в другой сервис. Сервис работает в докер-контейнере
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"]
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Необходимо создать два поля формы, чтобы в одно поле ввести, например, 1000 строк и во второе поле 1000 строк, нажать на кнопку "Выполнить"
Какой самый быстрый способ импортировать файл CSV в базу данных кроме COPYДанных очень много, около 125 млн записей
у меня есть такой вот рабочий код, ну кажется я сделал что-то не так, подскажите пожалуйста как можно улучшить качество кода: