大佬教程收集整理的这篇文章主要介绍了asp.net – “线程被中止了什么”. ‘SNIReadSync(SNI_Conn *,SNI_Packet **,Int32)’是什么意思?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在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,@R_944_10495@ng resetOptions@R_944_10495@ng) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,Boolean returnStream,Boolean asynC) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,@R_944_10495@ng method,DbAsyncResult result) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,@R_944_10495@ng method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior,@R_944_10495@ng method) at System.Data.SqlClient.SqlCommand.Exec
谢谢!
如果您在另一个线程中运行此代码(良好的选择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 – “线程被中止了什么”. ‘SNIReadSync(SNI_Conn *,SNI_Packet **,Int32)’是什么意思?全部内容,希望文章能够帮你解决asp.net – “线程被中止了什么”. ‘SNIReadSync(SNI_Conn *,SNI_Packet **,Int32)’是什么意思?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。