Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带循环和WCF的Windows服务线程_C#_Multithreading_Wcf_Windows Services - Fatal编程技术网

C# 带循环和WCF的Windows服务线程

C# 带循环和WCF的Windows服务线程,c#,multithreading,wcf,windows-services,C#,Multithreading,Wcf,Windows Services,首先,我将讨论一些遗留代码,我们正在尽量避免对其进行更改。另外,我在windows服务和WCF方面的经验有点有限,所以有些问题可能有点新手。在提出问题之前,先介绍一下情况 我们有一个循环的现有服务。它通过数据库调用检查是否有记录要处理。如果找不到任何记录,它将休眠30秒,然后重新唤醒以重试 我想为这个服务添加一个入口点,除了处理数据库中的记录外,它还允许我向这个服务传递一个记录。所以基本流程是 循环 *从数据库读取记录 *如果数据库中没有记录,则处理通过入口点传入的所有记录。 *没有任何记录,睡

首先,我将讨论一些遗留代码,我们正在尽量避免对其进行更改。另外,我在windows服务和WCF方面的经验有点有限,所以有些问题可能有点新手。在提出问题之前,先介绍一下情况

我们有一个循环的现有服务。它通过数据库调用检查是否有记录要处理。如果找不到任何记录,它将休眠30秒,然后重新唤醒以重试

我想为这个服务添加一个入口点,除了处理数据库中的记录外,它还允许我向这个服务传递一个记录。所以基本流程是

循环
*从数据库读取记录
*如果数据库中没有记录,则处理通过入口点传入的所有记录。
*没有任何记录,睡眠30秒

我关心的是这一点。是否有可能在一个服务中实现这一点,这样我就有了循环过程,但我也允许调用随时进入,并向可以在循环中处理的队列添加其他项。我关心的是并发性,并防止循环和侦听器相互干扰

我知道这个问题的措辞可能不太正确,但我在处理这个问题时站在了新的角度。任何帮助都将不胜感激

我关心的是并发性,并防止循环和侦听器相互干扰

只要正确同步访问,这不应该是一个问题


最简单的选择可能是使用线程安全的集合,例如,保存要处理的项。WCF服务只需将项目添加到集合中就可以了,您的下一个处理步骤将处理它。这种情况下的同步实际上是最小的,因为队列已经是完全线程安全的

除了Reed的出色回答之外,您可能还希望将记录保存在一个数据库中,以防止您的服务在关闭、重新启动或崩溃时丢失记录。

什么样的“入口点”-是什么发出此入口点的信号,以及它将如何做?如果必须尽可能少地更改遗留代码,那么您能否将此“事件”数据添加到数据库表中?即时,“事件”数据可以很容易地通过TCP/管道发送到服务,并排队到处理线程,处理线程通常在队列上等待30秒超时。如果是我,我会很想添加一个存储过程/触发器,它将对条目进行排队,以立即通知服务有可用的记录,但我想这已经过时了:(谢谢你的建议。我很想使用它,但由于我不能在这里讨论的原因,我被告知MSMQ不是一个选项。商业原因而不是技术原因。谢谢你的建议。今晚我将尝试一些压力测试,你的建议,但听起来像是我需要的。老实说,这是我的主要问题。)担心(如何管理队列线程安全)@Bomlin您可能还想看看BlockingCollection-将它与GetConsumingEnumerable一起使用会使类似的事情变得简单,实际上可以完全消除30秒的睡眠,因为它只需在添加项目时进行处理,而无需使用计时器…里德,您对ConcurrentQueue的建议非常有效。我编写了一个正在循环并有侦听器。然后我编写了一个客户端,生成了10个单独的线程,每个线程都添加了大量项目。我随机化了项目的队列以及在循环中处理它们所需的时间。据我所知,10000个项目根本没有并发问题。作为上面的补充说明,我还应该有mentio内德,这个过程将在几个月内被取代。这就是为什么我要做这个辅助型编码。