asp.net – “线程被中止了什么”. ‘SNIReadSync(SNI_Conn *,SNI_Packet **,Int32)’是什么意思?

前端之家收集整理的这篇文章主要介绍了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,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将会出错,因为取消变量已被取消并被破坏.在将这种模型适应您的实际架构时,请牢记这些事项;如果你在一个方法中启动线程并等待它在另一个方法中完成,同时在第三个(实际上是相当常见的情况)触发取消的情况下,该标志必须存在于不会在工作线程有结束执行.

原文链接:https://www.f2er.com/aspnet/246195.html

猜你在找的asp.Net相关文章