Прослушивание очереди Azure в консольном приложении - PullRequest
0 голосов
/ 26 февраля 2019

Я запускаю консольное приложение как службу Windows и получаю следующий код:

class Program
{
    [STAThread]
    static async Task Main(string[] args)
    {
        await new HostBuilder()
           .ConfigureServices((hostContext, services) =>
           {
               services.AddHostedService<MyService>();
               services.AddTransient<IConfiguration>(
                   (service) => new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("config.json")
                    .Build());

           })
           .RunConsoleAsync();
    }
}

и следующий код MyService:

public class MyService : IHostedService, IDisposable
{
    private Timer _timer;
    CloudQueue _queue;

    public MyService(IConfiguration configuration)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(configuration.GetSection("ConnectionStrings:StorageConnectionString").Value);
        CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
        _queue = queueClient.GetQueueReference(configuration.GetSection("Queue:OrganizationRegistration").Value);
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("Timed Background Service is starting.");

        //_timer = new Timer(DoWork, null, TimeSpan.Zero,
        //    TimeSpan.FromSeconds(5));

        return Task.CompletedTask;
    }

    private async Task DoWorkAsync(object state)
    {
        var message = _queue.GetMessageAsync();
        // long action
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("Timed Background Service is stopping.2");
        //_timer?.Change(Timeout.Infinite, 0);
        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }
}

Я хочу прослушать очередь Azure и, если сообщение существует, выполнить долгую операцию.Как правильно это реализовать?Я думал сделать это через Timer, но я не хочу выполнять еще одну операцию, пока выполняется первая.

...