已部署代码超时但在调试期间未超时

时间:2011-05-11 21:22:11

标签: c# winforms deployment timeout

我有一个C#winforms应用程序,其中包含以下相关项:

  • VS2010 SP1,.NET 3.5
  • 流利的NHibernate 1.0(使用NH 3.0,也许这是问题的一部分)
  • 使用ClickOnce部署
  • SQL Server 2008 R2数据库

我已经在我的机器上安装了部署的副本(通过ClickOnce),并且通过VS2010调试器并排运行另一个副本。它是相同的代码库。我昨天刚刚发布,自发布以来没有更改任何代码。

在同一台计算机上(同时并行运行),指向同一个SQL Server实例,我的应用程序的部署副本超时尝试写入数据库。通过调试器启动的副本写得很好。这是可重复的,每一次。

在现实世界中,只有几个人报告超时。他们在同一个部门,就在建筑物的同一个地方。他们是唯一的(好吧,我知道)。我正在使用相同的SQL实例来调试他们正在使用的。

所有文件(.pdb除外)都包含在解决方案中所有项目的部署中。

这是外部异常的堆栈跟踪(我还没有任何内部异常):

Stack Trace:
   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(TdsParserStateObject stateObj)
   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()
   at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
   at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session)
   at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
   at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
   at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) 

什么可能导致一个而不是另一个超时?在同一台机器上,同时运行(甚至一个接一个地运行)。我甚至从build \ bin \文件夹本地运行它没有超时,就像通过调试器一样。它只是部署的副本产生超时。

更新
我已经能够为生产环境捕获SQL事件探查器跟踪,除了对数据库的实际写入之外,一切都进入SQL,这在后台线程上确实发生。执行保存的方法(可以包含INSERTS和/或UPDATES的组合)将被调用,因为我在跟踪中看到该方法中的查询在保存完成之前运行。我正在努力捕获整个异常堆栈。

更新2:
我终于在调试器中重现了错误并且已经隔离了抛出异常的地方。上面提到的在保存之前发生的查询导致超时。这很好,现在我可以解决这个问题并继续前进。

但问题仍然存在:为什么它会在运行发布代码的进程中抛出,而不是在运行完全相同代码库的调试进程中抛出。

3 个答案:

答案 0 :(得分:1)

当您使用调试模式时,请求超时是无限的,但是当您通过已发布的版本运行它时则不是这样。

如果要调用Web服务来写入数据库,请增加请求超时,如果没有,请增加web.config中数据库的连接超时时间或者放置连接字符串的位置。

此致 VINIT

答案 1 :(得分:0)

我遇到与数据库连接相同的问题。

我从用户那里听说他们有完全相同的例外。 一开始我不知道出了什么问题。

解决方案是他们没有连接他们的VPN密钥

此致 亚当

答案 2 :(得分:0)

你提到在后台线程中写入数据库,这让我认为这可能是一种并发(多线程)问题。

通常会优化发布版本,这就是为什么它们可能与调试版本略有不同。这可能会导致现有的并发问题成为一个实际问题。不同的用户具有不同的硬件,具有不同数量的CPU核心(等),再次可能导致执行顺序的细微变化。

所有这些都是一个疯狂的猜测而没有深入研究代码,但多线程通常是这些类型的“神秘”问题的罪魁祸首。