SQL Service Broker和.NET Windows服务-最佳实践?

SQL Service Broker和.NET Windows服务-最佳实践?,.net,sql-server,service-broker,.net,Sql Server,Service Broker,我目前有一个从遗留应用程序更新的数据库。我希望利用SQLServiceBroker队列,以便在更新记录时,将消息放入队列中(使用触发器或其他方法) 然后,我希望有一个长时间运行的应用程序(用.NET编写的Windows服务),它不断地“侦听”队列以获取消息并为另一个应用程序处理它们 我在网上找到了一些示例代码,只是想了解一下代码是否可靠。下面是Windows服务类的缩写版本: public class MyService { public void StartService()

我目前有一个从遗留应用程序更新的数据库。我希望利用SQLServiceBroker队列,以便在更新记录时,将消息放入队列中(使用触发器或其他方法)

然后,我希望有一个长时间运行的应用程序(用.NET编写的Windows服务),它不断地“侦听”队列以获取消息并为另一个应用程序处理它们

我在网上找到了一些示例代码,只是想了解一下代码是否可靠。下面是Windows服务类的缩写版本:

public class MyService
{
    public void StartService()
    {
        Thread listener = new Thread(Listen);
        listener.IsBackground = true;
        listener.Start();
    }

    private void Listen()
    {
        while (true)
        {
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                string commandText = "WAITFOR ( RECEIVE * FROM MyQueue);";
                using (SqlCommand command = new SqlCommand(commandText, connection))
                {
                    connection.Open();
                    command.CommandTimeout = 0;
                    SqlDataReader reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        // Process message
                    }
                }
            }
        }
    }
}

你觉得怎么样?代码完全按照我希望的方式工作。但是,在无限循环中,拆分包含SQL命令的新线程的想法永远不会超时,这让我有点紧张。

如果您在无限循环中,您的服务不会完全关闭。您应该检查退出条件,当服务收到关闭消息时设置为on。您可以向WAITFOR添加超时,以便检查是否应该关闭。您还应该在处理的每一行上检查这一点

我使用了2秒钟的睡眠来延迟,但是在WAITFOR上做2秒钟的超时将完成同样的事情

服务有30秒关机或Windows会认为它被卡住。