asp.net – “线程被中止了什么”. ‘SNIReadSync(SNI_Conn *,SNI_Packet **,
发布时间:2021-01-12 14:41:49 所属栏目:asp.Net 来源:互联网
导读:你好, 在ASP.Net WebApp(使用SQL Server 2008)中,当处理大量数据时,我会收到以下异常,并且在代码中的随机位置看来这个异常被抛出. 这个异常是什么意思?是超时吗? Thread was being aborted. at SNIReadSync(SNI_Conn* , SNI_Packet** , Int32 ) at SNINativ
你好, 在ASP.Net WebApp(使用SQL Server 2008)中,当处理大量数据时,我会收到以下异常,并且在代码中的随机位置看来这个异常被抛出. 这个异常是什么意思?是超时吗? Thread was being aborted. at SNIReadSync(SNI_Conn*,SNI_Packet**,Int32 ) at SNINativeMethodWrapper.SNIReadSync(SafeHandle pConn,IntPtr& packet,Int32 timeout) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult,TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() at System.Data.SqlClient.TdsParserStateObject.ReadBuffer() at System.Data.SqlClient.TdsParserStateObject.ReadByte() 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,Boolean returnStream,Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,String method,DbAsyncResult result) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior,String method) at System.Data.SqlClient.SqlCommand.Exec 谢谢! 解决方法“线程正在中止”99%的时间是由您的代码使用Thread.Abort()引起的,在任何其他情况下终止进程,而不是灾难性故障. Thread.Abort是邪恶的,因为它从它自己的执行代码之外的线程中注入一个异常,因此期望和优雅地处理它是非常困难的,甚至是不可能的.如果您在另一个线程中运行此代码(良好的选择BTW; DB操作是多线程的天然候选),请勿使用Thread.Abort()尝试控制线程.您应该建立线程的代码来响应您可以触发的一些外部更改,这将导致其正常结束处理.这是一个简单的例子: public class Foo { public void MainMethod() { bool cancel = false; //our external flag //our worker thread,which is being given a callback method to poll at "safe" times. var workerThread = new Thread(()=>AsyncMethod(()=>cancel)); //start the thread workerThread.Start(); //do some other work that takes less time than the thread Thread.Sleep(200) //async thread is still going; cancel execution and wait for graceful exit. cancel = true; workerThread.Join(); } public void AsyncMethod(Func<bool> wasCancelled) { //Do some repetitive task that takes longer than we're willing to wait for(var i=1; i<2000; i++) { if(wasCancelled()) break; //generally a "safe" place to check Thread.Sleep(50); //stand-in for some atomic operation that should not be interrupted. } if(wasCancelled()) Debug.WriteLine("Thread cancelled"); else Debug.WriteLine("Thread completed"); } } 这个例子确实使用了一个带有“external closure”的lambda;如果我们的方法在工作线程完成之前退出,则lambda将会出错,因为取消变量已被取消并被破坏.在将这种模型适应您的实际架构时,请牢记这些事项;如果你在一个方法中启动线程并等待它在另一个方法中完成,同时在第三个(实际上是相当常见的情况)触发取消的情况下,该标志必须存在于不会在工作线程有结束执行. (编辑:十堰站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 应用程序池循环如何影响ASP Net会话状态?
- asp.net-mvc – 缩小ASP.NET MVC中的Action Filter属性
- webforms – ASP.Net Core 1.0是否支持WebForm项目
- asp.net – 在客户端启用/禁用RequiredValidator /不启动Cu
- asp.net – 如何序列化LINQ-to-SQL惰性列表
- asp.net – 测试Oracle存储过程的最简单的方法
- asp.net – 多个用户控件和JavaScript
- .net – 什么可以解释托管堆上超过5,000,000个System.WeakR
- ASP.NET页面在IE缓存的清除办法
- asp.net-mvc – 在MVC ActionLink中使用Knockout绑定
推荐文章
站长推荐
- 为熟悉ASP.NET Web表单开发的人建议MVC3的周末学
- asp.net-mvc – 文件上传MVC
- asp.net-mvc – 如何检查是否为浏览器启用了cook
- asp.net – WebForms:MasterPages中的动态(或绝
- asp.net – 什么时候Response.IsClientConnected
- asp.net中利用Jquery+Ajax+Json实现无刷新分页的
- asp.net – WebFormsMVP的缺点?
- 这是一个bug?浮动操作被视为整数
- 什么是链接服务器的ASP.NET连接字符串格式?
- asp.net – IControllerFactory’MyWebSite.WebU
热点阅读