Error de dependencia SQL después de mucho tiempo

Obtuve un servicio de Windows escuchando inserciones en una tabla usando la clase SqlDependency.

Funciona bien durante varios días, pero de repente deja de funcionar.

En el escenario normal recibo eventos de cambio

e.Type = SqlNotificationType.Cambio
e.Info = SqlNotificationInfo.Insertar
e.Source = SqlNotificationSource.Datos

Si nada cambia, obtengo eventos de tiempo de espera cada 3600 segundos

e.Type = SqlNotificationType.Cambio
e.Info = SqlNotificationInfo.Error
e.Source = SqlNotificationSource.Se acabó el tiempo

o (no sé por qué hay dos eventos de tiempo de espera diferentes)

e.Type = SqlNotificationType.Cambio
e.Info = SqlNotificationInfo.Desconocido
e.Source = SqlNotificationSource.Se acabó el tiempo

Esto puede funcionar durante una semana o más, pero de repente ya no recibo eventos de cambio y en su lugar recibo un evento cada 60 segundos con

e.Type = SqlNotificationType.Cambio
e.Info = SqlNotificationInfo.Error
e.Source = SqlNotificationSource.Cliente

La documentación de msdn paraSqlNotificationSource.Client dice

Se produjo una notificación iniciada por el cliente, como un tiempo de espera del lado del cliente o como resultado de intentar agregar un comando a una dependencia que ya se ha activado.

Creo que esto significa que se produjo un tiempo de espera al crear la dependencia.

El mismo código se ejecuta todo el tiempo y se ve así:

private void CreateDependency() {
    using (var connection = new SqlConnection(_connectionString)) {
        connection.Open();

        var command = new SqlCommand();
        command.CommandText = "SELECT ...";
        command.Connection = connection;

        new SqlDependency(command, "ServiceName", DependencyTimeout).OnChange += OnChange;

        command.ExecuteNonQuery();
    }
}

private void OnChange(object sender, SqlNotificationEventArgs e) {
    ((SqlDependency)sender).OnChange -= OnChange;

    if (e.Type == SqlNotificationType.Change && e.Info == SqlNotificationInfo.Insert) {
        _changeWorkerNotifier.Set(); // AutoResetEvent
    }

    CreateDependency();
}

Si reinicio mi servicio, vuelve a funcionar bien.

Investigué un poco y descubrí que los errores parecen comenzar después de una copia de seguridad programada en el servidor (que ocurre todos los días). Tengo otra aplicación donde casi al mismo tiempo recibo errores como

Se produjo un error de nivel de transporte al recibir resultados del servidor. (proveedor: Proveedor TCP, error: 0 - El tiempo de espera del semáforo ha expirado).

Mi conjetura original era queSqlDependency.Start() crea una conexión al servidor que falla durante la copia de seguridad programada y nunca se recupera. Pero la primera línea en eldocumentación msdn dice

El oyente SqlDependency se reiniciará cuando ocurra un error en la conexión de SQL Server.

¿Alguna idea sobre cómo resolver esto?
(Por supuesto, puedo dejar que el servicio falle y que el administrador del servicio lo reinicie. El problema es que el servicio también hace otras cosas que deben cerrarse correctamente, por lo que no puedo simplemente hacer Enviroment.Exit (-1) desde controlador de eventos)

Respuestas a la pregunta(1)

Su respuesta a la pregunta