«Правильный» способ создания консольного приложения .NET Core без фоновых служб.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 «Правильный» способ создания консольного приложения .NET Core без фоновых служб.

Сообщение Anonymous »

Я создаю простое консольное приложение .NET Core, которое будет считывать основные параметры из командной строки, а затем выполняться и завершаться без взаимодействия с пользователем. Я хотел бы воспользоваться преимуществами DI, и это привело меня к использованию универсального хоста .NET Core.
Все найденные мной примеры создания консольного приложения создают класс который либо реализует IHostedService, либо расширяет BackgroundService. Затем этот класс добавляется в контейнер службы через AddHostedService и запускает работу приложения через StartAsync или ExecuteAsync. Однако кажется, что во всех этих примерах они реализуют фоновую службу или какое-то другое приложение, которое работает в цикле или ждет запросов, пока оно не будет отключено ОС или не получит какой-либо запрос на завершение. Что, если мне просто нужно, чтобы приложение запускалось, выполняло свою работу, а затем закрывалось? Например:
Program.cs:

Код: Выделить всё

namespace MyApp
{
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

public static class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).RunConsoleAsync();
}

private static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseConsoleLifetime()
.ConfigureLogging(builder => builder.SetMinimumLevel(LogLevel.Warning))
.ConfigureServices((hostContext, services) =>
{
services.Configure(hostContext.Configuration);
services.AddHostedService();
services.AddSingleton(Console.Out);
});
}
}
MyServiceOptions.cs:

Код: Выделить всё

namespace MyApp
{
public class MyServiceOptions
{
public int OpCode { get; set; }
public int Operand { get; set; }
}
}
MyService.cs:

Код: Выделить всё

namespace MyApp
{
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;

public class MyService : IHostedService
{
private readonly MyServiceOptions _options;
private readonly TextWriter _outputWriter;

public MyService(TextWriter outputWriter, IOptions options)
{
_options = options.Value;
_outputWriter = outputWriter;
}

public async Task StartAsync(CancellationToken cancellationToken)
{
_outputWriter.WriteLine("Starting work");

DoOperation(_options.OpCode, _options.Operand);

_outputWriter.WriteLine("Work complete");
}

public async Task StopAsync(CancellationToken cancellationToken)
{
_outputWriter.WriteLine("StopAsync");
}

protected void DoOperation(int opCode, int operand)
{
_outputWriter.WriteLine("Doing {0} to {1}...", opCode, operand);

// Do work that might take awhile
}
}
}
Этот код компилируется и работает нормально, выдавая следующий результат:

Код: Выделить всё

Starting work
Doing 1 to 2...
Work complete
Однако после этого приложение просто будет ждать, пока я не нажму Ctrl+C. Я знаю, что могу принудительно завершить работу приложения после завершения работы, но на данный момент мне кажется, что я неправильно использую IHostedService. Кажется, что он предназначен для повторяющихся фоновых процессов, а не для простых консольных приложений, подобных этому. Однако в реальном приложении, где выполнение операции может занять 20–30 минут, я хотел бы воспользоваться методом StopAsync для очистки перед завершением. Я также знаю, что могу сам создать контейнер службы и все такое, но универсальный хост .NET Core уже делает многое из того, что мне в любом случае хотелось бы сделать. Кажется правильным способом написания консольных приложений, но как мне заставить приложение делать что-нибудь без добавления размещенной службы, запускающей реальную работу?

Подробнее здесь: https://stackoverflow.com/questions/669 ... d-services
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • «Правильный» способ создания консольного приложения .NET Core без фоновых служб.
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Каталог служб WSO2 4.3.0 (произошла ошибка при получении служб из каталога служб.)
    Anonymous » » в форуме Apache
    0 Ответы
    63 Просмотры
    Последнее сообщение Anonymous
  • Каталог служб WSO2 4.3.0 (произошла ошибка при получении служб из каталога служб.)
    Anonymous » » в форуме JAVA
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Запуск нескольких фоновых служб ASP.NET Core
    Anonymous » » в форуме C#
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Запуск нескольких фоновых служб ASP.NET Core
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»