Procedimiento de tiempo de espera de ADO.NET pero no en SSMS

Tengo un procedimiento almacenado que me está dando una SqlException debido a un tiempo de espera cuando lo ejecuto desde el código (con el tiempo de espera establecido en 30). Cuando ejecuto el procedimiento directamente en Management Studio, se ejecuta en menos de 1 segundo. También solo obtengo el tiempo de espera cuando lo ejecuto en una base de datos específica. Cuando uso otras bases de datos, termina rápidamente sin errores. Aquí está el mensaje de error completo:

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)

¿Este seguimiento de pila significa algo para alguien? Parece que tal vez mi sproc se completó y se agotó el tiempo al intentar leer algún tipo de metadatos.

Intenté mirar el proceso mientras se está ejecutando y está suspendido. sys.dm_os_waiting_tasks muestra el tipo de espera como IO_COMPLETION, si es de alguna utilidad. Los únicos procesos que veo en la base de datos usando sp_who2 'active' son el tiempo de espera y mi ventana SSMS activa, así que no creo que sea un problema de bloqueo. Verifiqué que esta base de datos tiene las mismas indeces que una base de datos en funcionamiento y ejecuté dbcc checkdb sin ningún error. ¿Cómo puedo determinar la causa del tiempo de espera?

Respuestas a la pregunta(1)

Su respuesta a la pregunta