C#StackTrace方法名称与源代码不一致
我有一个例子,堆栈跟踪包含的方法名与源代码中的方法不一致。源代码调用C#StackTrace方法名称与源代码不一致,c#,stack,stack-trace,C#,Stack,Stack Trace,我有一个例子,堆栈跟踪包含的方法名与源代码中的方法不一致。源代码调用.FirstOrDefault(),并抛出一个DbUpdateException,其中堆栈跟踪显示.SingleOrDefault() 这不是源代码与加载到进程空间的DLL版本不一致的情况。我确信这一点,因为: 此源代码从未调用过.SingleOrDefault() 为了验证DLL实际上包含对.FirstOrDefault()的调用,而不是对.SingleOrDefault()的调用,我执行了以下操作: 启动应用程序 使用Sy
.FirstOrDefault()
,并抛出一个DbUpdateException
,其中堆栈跟踪显示.SingleOrDefault()
这不是源代码与加载到进程空间的DLL版本不一致的情况。我确信这一点,因为:
.SingleOrDefault()
.FirstOrDefault()
的调用,而不是对.SingleOrDefault()
的调用,我执行了以下操作:
- 启动应用程序
- 使用Sysinternals进程资源管理器在运行的进程空间中查找DLL
- 从Process Explorer复制加载的DLL的完整路径
- 将该DLL加载到JustDecompile中,并找到对
.FirstOrDefault()的调用
.FirstOrDefault()
):
那么,有人能解释为什么运行时将.SingleOrDefault()
而不是.FirstOrDefault()
记录到堆栈跟踪中吗
我在这里没有任何功能问题,代码的行为与我预期的一样。当有多个项通过相关查询的.Where(…)
子句时,代码不会抛出InvalidOperationException
.SingleOrDefault()
所期望的无效操作异常。因此,代码的行为就像调用.FirstOrDefault()
,正如我所期望的那样。只是堆栈跟踪错误地显示它让我感到不安(它只让我感到不安,因为我不理解它!!)
最后一件事。。。我有另一个同样奇怪行为的例子。简而言之,我的代码调用.LastOrDefault()
,但堆栈显示System.Linq.Enumerable.TryGetLast[TSource](IEnumerable`1 source,Boolean&found)
。如果我在堆栈中看到.LastOrDefault()
,然后依次看到.LastOrDefault()
调用.TryGetLast()
,我就会理解这一点,但是没有,我的代码似乎直接根据堆栈调用.TryGetLast()
。所以,这很奇怪
想法?谢谢
~z~史蒂夫
private QueueEntry FetchNextQueueEntryOrDefault(long? queueEntryId, BatchProcessingQueueDefinition? queueDefinition, DefaultDbContext context)
{
DateTimeOffset now = DateTimeOffset.get_Now();
IQueryable<QueueEntry> queryable = Queryable.Where<QueueEntry>(context.QueueEntries.Include<QueueEntry, QueueDefinitionSchedule>((QueueEntry x) => x.QueueDefinitionSchedule), (QueueEntry o) => (Int32)o.Status == 0);
if (queueEntryId.get_HasValue())
{
queryable = Queryable.Where<QueueEntry>(queryable, (QueueEntry o) => (long?)o.Id == queueEntryId);
}
if (queueDefinition.get_HasValue())
{
queryable = Queryable.Where<QueueEntry>(queryable, (QueueEntry o) => (int?)o.QueueDefinitionId == (int?)queueDefinition);
}
queryable = Queryable.Where<QueueEntry>(queryable, (QueueEntry o) => (o.DoNotExecuteUntilMoment == null) || (o.DoNotExecuteUntilMoment <= (DateTimeOffset?)now));
return Queryable.FirstOrDefault<QueueEntry>(queryable);
}
Microsoft.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
---> System.ComponentModel.Win32Exception (258): The wait operation timed out.
at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at Microsoft.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at Microsoft.Data.SqlClient.SqlDataReader.get_MetaData()
at Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean isAsync, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String method)
at Microsoft.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
at *** System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) ***
at DataAccess.Repositories.QueueEntryExecutionRepository.FetchNextQueueEntryOrDefault(Nullable`1 queueEntryId, Nullable`1 queueDefinition, DefaultDbContext context) in E:\Work\Clients\Schaneville\CryptoBot\src\DataAccess\Repositories\QueueEntryExecutionRepository.cs:line 103
at DataAccess.Repositories.QueueEntryExecutionRepository.FetchNextQueueEntryOrDefaultWithConcurrencyCheck(Nullable`1 queueEntryId, Nullable`1 queueDefinition, DefaultDbContext context, TransactionScope scope) in E:\Work\Clients\Schaneville\CryptoBot\src\DataAccess\Repositories\QueueEntryExecutionRepository.cs:line 83
at DataAccess.Repositories.QueueEntryExecutionRepository.TryFetchNextQueueEntryForExecution(Nullable`1 queueEntryId, Nullable`1 queueDefinition) in E:\Work\Clients\Schaneville\CryptoBot\src\DataAccess\Repositories\QueueEntryExecutionRepository.cs:line 54
at DataAccess.Repositories.QueueEntryExecutionRepository.TryFetchNextQueueEntryForExecution(BatchProcessingQueueDefinition queueDefinition) in E:\Work\Clients\Schaneville\CryptoBot\src\DataAccess\Repositories\QueueEntryExecutionRepository.cs:line 42
at Core.Framework.Commands.BatchProcessing.Services.ExecuteNextQueueEntryService.Execute(BatchProcessingQueueDefinition queueDefinition) in E:\Work\Clients\Schaneville\CryptoBot\src\Core\Framework\Commands\BatchProcessing\Services\ExecuteNextQueueEntryService.cs:line 98
at Core.Framework.Commands.BatchProcessing.Services.ExecutePendingQueueEntriesService.InvokeService(IExecuteNextQueueEntryService service) in E:\Work\Clients\Schaneville\CryptoBot\src\Core\Framework\Commands\BatchProcessing\Services\ExecutePendingQueueEntriesService.cs:line 100
at Core.Framework.Commands.BatchProcessing.Services.ExecutePendingQueueEntriesService.ProcessOneQueueEntry() in E:\Work\Clients\Schaneville\CryptoBot\src\Core\Framework\Commands\BatchProcessing\Services\ExecutePendingQueueEntriesService.cs:line 75
at Core.Framework.Commands.BatchProcessing.Services.ExecutePendingQueueEntriesService.TryProcessOneQueueEntry() in E:\Work\Clients\Schaneville\CryptoBot\src\Core\Framework\Commands\BatchProcessing\Services\ExecutePendingQueueEntriesService.cs:line 61 ClientConnectionId:2c8ecfdc-2b17-4371-913c-a34158a53600 Error Number:-2,State:0,Class:11