2或3天后,窗口服务中的C#Infitine池以某种方式崩溃了

问题描述

我在C#中有一个Windows服务,该服务启动了一个无限池来读取AWS SQS(队列)

代码如下:

//AWS SQS
private readonly SQSMessagebroker _sqsProcessor;
private Task _sqsTask;
private readonly CancellationTokenSource _cancellation;

public SyncService(Services services)
{
    _services = services;

    InitializeComponent();
    CanPauseAndContinue = true;

    // AWS SQS
    _sqsProcessor = new SQSMessagebroker(_services);
    _cancellation = new CancellationTokenSource();
}

protected override void OnStart(string[] args)
{
    EventLog.WriteEntry(ServiceName + " service started");

    // start sqs processor
    _sqsProcessor.Model = _model;
    _sqsProcessor.ServiceName = this.ServiceName;
    _sqsTask = _sqsProcessor.Run(_cancellation.Token);
}

protected override void OnStop()
{
    _cancellation.Cancel();

    try
    {
        _sqsTask.Wait();
    }
    catch (Exception e)
    {
        Console.WriteLine("SQS task was cancelled.");
    }
}

还有我的SQSMessagebroker班级:

public class SQSMessagebroker
{
    private readonly string _sqsQueueUrl;
    private readonly IAmazonSQS _amazonSqs;

    private Services _services;

    private ConfigurationModel _model;

    public ConfigurationModel Model { set { _model = value; } }
    public string ServiceName { get; set; }

    public SQSMessagebroker(Services services)
    {
        _services = services;
    }


    public async Task Run(CancellationToken cancellationToken)
    {
        while (!cancellationToken.IsCancellationRequested)
        {
            var receiveMessageRequest = new ReceiveMessageRequest
            {
                QueueUrl = _sqsQueueUrl
            };

            var receiveMessageResponse = await _amazonSqs.ReceiveMessageAsync(receiveMessageRequest,cancellationToken);
            if (!receiveMessageResponse.Messages.Any())
            {
                continue;
            }

            foreach (var message in receiveMessageResponse.Messages)
            {

                ... some code here

                    >>> HERE
                    * **something Could be crashing here the while loop * **


            }
        }
    }
}

因此,如果您看到我的服务何时启动,infinite pooling任务就会启动,并且它应该永远运行。问题是由于某种原因,在2天或3天后它会停止工作,我想是因为while循环中的某些内容生成exception,然后任务被取消了。

您建议我在while循环内做什么?我应该添加一条try catch语句,然后如果发生exception再次运行无限池任务,以使其始终运行吗?

我需要无限循环始终运行,即使由于某些原因有时在while循环中崩溃了。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)