4

我在使用 ADO.Net Entity 框架读取数据时遇到了一个奇怪的问题。

我有两个表,“调查”和“PatientVists”。“VisitId”是“PatientVists”中的主键,是“surveys”表中的外键。

我正在使用以下查询:

foreach (var survey in db.Surveys.Include(p => p.PatientVisit).Where(p => p.FacilityId == f.Id && p.IsCompleted == true && p.IsImaged == false).OrderBy(p => p.PatientVisit.MrnId).ThenBy(p => p.DateUpdated).ToList())

{
 // reminign code
}

上面的查询似乎很正常。但是在执行查询时,我遇到了线程中止异常。我可以理解是否由于大量数据而导致超时异常。但我不确定为什么会出现线程中止异常。我没有明确地产生一个线程。此代码片段在网络服务中,但我相信它与此无关。

以下是堆栈跟踪:

System.Threading.ThreadAbortException: Thread was being aborted.
   at SNIReadSyncOverAsync(SNI_ConnWrapper* , SNI_Packet** , Int32 )
   at SNINativeMethodWrapper.SNIReadSyncOverAsync(SafeHandle pConn, IntPtr& packet, Int32 timeout)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
   at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
   at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   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, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
   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.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
   at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)
   at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

是重新选择了“ToList”运算符还是“include”运算符产生了一个线程?我应该用加入来代替它吗?一般来说,从性能角度来看,哪种方法是首选方法?

请让我知道是否有人对特定异常有深入了解

谢谢

4

1 回答 1

6

我认为这是为超时的 Web 应用程序/服务提供服务的基本线程。如果您在自己的线程上生成进程,它应该可以解决问题。

您还可以尝试此处发布的解决方法: https ://sharepoint.stackexchange.com/questions/9380/thread-was-being-aborted-with-sharepoint-2010

将以下代码添加到 Web.Config:

< system.web >
< httpRuntime executionTimeout="36000" />
< / system.web >

在我将代码更改为在自己的线程中运行之前,它对我来说是一个临时解决方案!

于 2016-02-18T06:22:00.530 回答