private void ProcessAttention(TdsParserStateObject stateObj) { if (_state == TdsParserState.Closed || _state == TdsParserState.Broken) { return; } Debug.Assert(stateObj._attentionSent, "invalid attempt to ProcessAttention, attentionSent == false!"); // Attention processing scenarios: // 1) EOM packet with header ST_AACK bit plus DONE with status DONE_ATTN // 2) Packet without ST_AACK header bit but has DONE with status DONE_ATTN // 3) Secondary timeout occurs while reading, break connection // Since errors can occur and we need to cancel prior to throwing those errors, we // cache away error state and then process TDS for the attention. We restore those // errors after processing. stateObj.StoreErrorAndWarningForAttention(); try { // Call run loop to process looking for attention ack. Run(RunBehavior.Attention, null, null, null, stateObj); } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } // If an exception occurs - break the connection. // Attention error will not be thrown in this case by Run(), but other failures may. _state = TdsParserState.Broken; _connHandler.BreakConnection(); throw; } stateObj.RestoreErrorAndWarningAfterAttention(); Debug.Assert(!stateObj._attentionSent, "Invalid attentionSent state at end of ProcessAttention"); }