问题描述
我在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 (将#修改为@)