2011-05-05 16 views
0

刚刚遇到一篇关于消息队列的文章。我有一个服务每隔1秒运行一个进程。该过程将名为“ProcessLock”的静态布尔更改为true。然后,过程检查,看是否该变量是事实,就执行这样前:我应该使用消息队列来保证Windows服务只能在一条记录上运行吗?

if (!ProcessLock) 
{ 
    ProcessLock= true; 
    //dostuff 
} 

但是,如果这个过程是循环轮再次进入托架刚过另一个线程支架后进入,但它有前将bool更改为true,那么我们会遇到问题,因为里面的代码会在相同的记录上开始运行两次。这种情况叫什么?我确定它有一个多线程术语?

无论如何,真正的重点是我可以使用MSMQ来解决这个问题吗?什么是一般的过程?

+0

这是'种族'状况。 – forsvarir 2011-05-05 13:02:55

+1

您仍然可以通过上面显示的代码片段(尽管不太可能)遇到竞争状况。更好的解决方法是使用'lock(process){/ * do stuff * /}' – jp2code 2011-05-05 13:03:41

回答

0

消息传递通常用于确保可靠的传递和放松服务之间的时间耦合。

据我所知,您的服务在每次执行时都使用相同的数据。在这种情况下,消息队列对你无能为力。毕竟,可以有多个消息并行处理。您可以将消息处理配置为在单个线程上运行(一次处理一条消息),但简单锁定可以更轻松地解决此问题。

另一方面,如果您可以为您的服务创建工作项目进行处理,某种排队将是有益的。它可以是简单的本土生长的Queue<WorkItem>,如果您不关心可靠性并且不需要进程间通信,则不需要复杂的消息传递基础结构。

相关问题