【发布时间】:2014-07-28 18:23:51
【问题描述】:
我正在编写一个 Windows 服务,它将启动多个工作线程,这些线程将侦听 Amazon SQS 队列并处理消息。大约有 20 个线程监听 10 个队列。
线程必须始终运行,这就是为什么我倾向于将实际线程用于工作循环而不是线程池线程。
这是一个顶级实现。 Windows 服务将启动多个工作线程,每个工作线程都会监听它的队列并处理消息。
protected override void OnStart(string[] args)
{
for (int i = 0; i < _workers; i++)
{
new Thread(RunWorker).Start();
}
}
这里是工作的实现
public async void RunWorker()
{
while(true)
{
// .. get message from amazon sqs sync.. about 20ms
var message = sqsClient.ReceiveMessage();
try
{
await PerformWebRequestAsync(message);
await InsertIntoDbAsync(message);
}
catch(SomeExeception)
{
// ... log
//continue to retry
continue;
}
sqsClient.DeleteMessage();
}
}
我知道我可以使用 Task.Run 执行相同的操作并在线程池线程上执行它,而不是启动单个线程,但我看不出这样做的原因,因为每个线程都会一直在运行。
您是否发现此实现有任何问题?让线程始终以这种方式运行有多可靠,我可以做些什么来确保每个线程始终在运行?
【问题讨论】:
标签: c# multithreading windows-services async-await threadpool