相关疑难解决方法(0)

如何正确清理Excel互操作对象?

我在C#(ApplicationClass)中使用Excel互操作,并在我的finally子句中放置了以下代码:

while (System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet) != 0) { }
excelSheet = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)

虽然这种工作,Excel.exe即使我关闭Excel后,该过程仍然在后台.只有在我的应用程序手动关闭后才会发布.

我做错了什么,或者是否有其他方法可以确保互操作对象得到妥善处理?

c# excel interop com-interop

733
推荐指数
20
解决办法
30万
查看次数

ExecuteNonQuery 在 .NET 4.6.1 中永远挂起

在极少数情况下,进程在执行过程中会冻结ExecuteNonQuery

cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

CommandTimeout设置为 0(无超时)并且UPDATE正在执行一个简单的语句。这通常很快,并且该问题平均每周可以重现一次。但当它发生时,整个过程就会完全冻结/挂起。上次重现时,我们使用 ProcDump 获取该特定进程的转储文件,并可以在那里看到该堆栈跟踪。其他 SO 问题之间的唯一区别是前几行(死锁?)

OS Thread Id: 0x4168 (34)
Current frame: ntdll!NtWaitForSingleObject+0xc
ChildEBP RetAddr  Caller, Callee
23eed994 7587f699 KERNELBASE!WaitForSingleObjectEx+0x99, calling ntdll!NtWaitForSingleObject
23eeda08 7587f5f2 KERNELBASE!WaitForSingleObject+0x12, calling KERNELBASE!WaitForSingleObjectEx
23eeda1c 5829e5e2 System_Data!Np::ReadSync+0x205, calling KERNELBASE!WaitForSingleObject
23eeda58 58293812 System_Data!SNIReadSync+0x64
23eeda88 5828a795 System_Data!SNIReadSyncOverAsync+0x25, calling System_Data!SNIReadSync
23eedaa4 53ce748e (MethodDesc 5395aa60 +0x46 DomainBoundILStubClass.IL_STUB_PInvoke(SNI_ConnWrapper*, SNI_Packet**, Int32))
23eedac8 53ce748e (MethodDesc 5395aa60 +0x46 DomainBoundILStubClass.IL_STUB_PInvoke(SNI_ConnWrapper*, SNI_Packet**, Int32))
23eedae4 53cf3c57 (MethodDesc 539498d0 +0x53 SNINativeMethodWrapper.SNIReadSyncOverAsync(System.Runtime.InteropServices.SafeHandle, IntPtr ByRef, Int32)), calling 08a34a78
23eedb04 53e00e5e (MethodDesc 5394a534 +0x5e …
Run Code Online (Sandbox Code Playgroud)

.net c# t-sql sql-server ado.net

6
推荐指数
1
解决办法
1112
查看次数

Windbg - 进程在 SNIReadSyncOverAsync 上冻结但未发现死锁

我有一个奇怪的问题。在 GetValue() 函数上使用 System.Data.SqlClient.SqlDataReader 读取数据时,进程被冻结/卡住。我正在使用 WinDbg 分析进程转储。我用SOS命令一样!dlk!SyncBlk!analyze -v -hang等,但他们没有表示任何死锁。

调用堆栈上的最后一次调用是

000000001a98e8a8 0000000076febd7a [InlinedCallFrame: 000000001a98e8a8] .**SNIReadSyncOverAsync**(SNI_ConnWrapper*, SNI_Packet**, Int32)
000000001a98e8a8 000007fee9e8bca1 [InlinedCallFrame: 000000001a98e8a8] .SNIReadSyncOverAsync(SNI_ConnWrapper*, SNI_Packet**, Int32)
000000001a98e880 000007fee9e8bca1 DomainBoundILStubClass.IL_STUB_PInvoke(SNI_ConnWrapper*, SNI_Packet**, Int32)
000000001a98e950 000007fee9e7254f SNINativeMethodWrapper.SNIReadSyncOverAsync(System.Runtime.InteropServices.SafeHandle, IntPtr ByRef, Int32)
000000001a98e9c0 000007fee9e7226e System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
000000001a98ea70 000007fee9e72180 System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
000000001a98eab0 000007fee9e72950 System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
000000001a98eae0 000007fee9e728d8 System.Data.SqlClient.TdsParserStateObject.TryReadByteArray(Byte[], Int32, Int32, Int32 ByRef)
000000001a98eb50 000007feea4c0adc System.Data.SqlClient.TdsParser.TryReadSqlValue(System.Data.SqlClient.SqlBuffer, System.Data.SqlClient.SqlMetaDataPriv, Int32, System.Data.SqlClient.TdsParserStateObject)
000000001a98ec10 000007fee9e85cb5 System.Data.SqlClient.SqlDataReader.TryReadColumnInternal(Int32, Boolean)
000000001a98ecb0 000007fee9e85af0 System.Data.SqlClient.SqlDataReader.TryReadColumn(Int32, Boolean, Boolean)
000000001a98ed20 000007fee9e85a0b System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32)
000000001a98ed60 000007fee9e859b7 System.Data.SqlClient.SqlDataReader.GetValue(Int32)
Run Code Online (Sandbox Code Playgroud)

在这里进一步调试的其他途径是什么?有人在使用 SqlDataReader …

deadlock windbg sqldatareader

5
推荐指数
0
解决办法
500
查看次数

需要帮助从C#诊断SQL Server奇怪的查询超时

我已经开发了许多.NET / SQL Server应用程序,但是我遭受了SQL查询超时的困扰,无法逾越。我在查找有问题的查询并重新索引/重新编写它们方面有丰富的经验。我的Web应用程序使用SQL Server的RDS和Web应用程序的EC2托管在AWS上。我们每天有100-200个唯一身份用户,数据库大约为15GB,其中有两个表大于1GB。

我整天都看到以下异常消息:

'Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.'
Run Code Online (Sandbox Code Playgroud)

遭受超时的查询与发生超时的时间一样随机。它似乎与任何显而易见的事情都不相符(备份运行一整夜等)。

我尝试从C#应用程序获取每个查询,然后直接在SQL中运行(使用与Arith Abort相同的SET选项),它们都运行良好。有些查询本质上是较慢的查询,但是最慢的查询在大约2秒钟内运行,并且具有约400k逻辑读取。但是,我还看到查询超时在15毫秒内运行,并且具有<10个逻辑读取。

我看到的最奇怪的事情是,我从Web应用程序中获取了一个查询,并将其编码到已运行24小时的控制台应用程序中,每秒调用一次查询。它没有一个异常/超时,即使我已经看到主系统在运行期间针对同一查询也存在超时。

我最近将RDS服务器升级到了M5 Large,并且每天都在一夜之间重建所有索引。我已经运行DBCC FREEPROCCACHE,以确保没有导致问题的过时查询计划。

我觉得这是参数嗅探,或者我最后的想法是硬件/网络故障,但这确实使人难忘!

我得到的堆栈跟踪看起来像是中间查询,而不是在连接阶段。

at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)  
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)  
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)  
   at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()  
   at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()  
   at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()  
   at System.Data.SqlClient.TdsParserStateObject.TryReadByteArray(Byte[] buff, Int32 offset, Int32 len, Int32& totalRead)  
   at System.Data.SqlClient.TdsParserStateObject.TryReadString(Int32 length, String& value)  
   at System.Data.SqlClient.TdsParser.TryReadSqlStringValue(SqlBuffer value, Byte type, Int32 length, …
Run Code Online (Sandbox Code Playgroud)

c# sql-server query-timeout

5
推荐指数
1
解决办法
590
查看次数