C# Newbie - Asynch Socket Problem
                            
                         
                        
                     
                 
                
                    I am in the process of becoming a self taught programmer...so patience with me...and if I ask any dumb questions...I apologize in advance.  I am trying to be as concise and clear as possible.
1.  There is a server application that is installed on my PC.  This application is an intermediary.  It connects to an internet server, so in that respect it is a client.  But from my perspective, it is a server.  I connect to this "server app" on my PC, with the application I am writing, using socket(s), locally at 127.0.0.1.
2.  My application instantiates a socket, or sockets, configures them, connects to this local server app on my PC...and then communicates.  I have all this working.
3.  The basic structure of the communication between my App, and this local Server is an Async Loop.  The fields/objects/methods are live on the main form of my basic WinForms App.  
4.  Here is the basic structure.  I have exclude minutae like the socket initiation....connection...and event handlers that start events....since I dont want to post a ton of code which will bore you all...
5.  Basically...my problem is I can't seem to figure out how to close the socket without crashing my App....
//******************************************************************************//
public partial class MainForm : Form
{
  private Socket A1Socket; 
  private AsyncCallback A1Callback;
  private byte[] a1SocketBuffer = new byte[65536]; 
  private bool a1BeginReceiveFlag = true; 
  private byte[] a1CopyBuffer = new byte[65536]; 
  bool stopWfdLoop = false;
  public MainForm()
  {InitializeComponent();}
  //Lot of stuff I skipped....
 
  //Event that kicks off data download
  private void SomeButton_Click(object sender, EventArgs e)  //At this point, my socket is up and running, and I want to star the loop that will pull data.
  {
  waitForData(CM.A1Cfg.SocketType);  //The argument CM.A1Cfg.SocketType is just a descriptive string.  In the future it will help differentiate between different socket types.
  }
 
 
  //The waitForData() method.  If the stopWfdLoop flag is set true...this stops the loop. 
  private void waitForData(string SocketType) 
  {
  if (!stopWfdLoop)
  {
  if (A1Callback == null)
  {
  A1Callback = new AsyncCallback(onReceive);
  }
  if (a1BeginReceiveFlag)  //This flag make sure we never call BeginReceive until we have copied the buffer
  {
  a1BeginReceiveFlag = false;
  A1Socket.BeginReceive(a1SocketBuffer, 0, a1SocketBuffer.Length, SocketFlags.None, A1Callback, SocketType);
  }
  }
  }
  
  //The OnReceive() method...which is automatically called by the .NET framework when data is ready to be copied on my end.
  private void onReceive(IAsyncResult argOr)  
  {
  if (argOr.AsyncState.ToString().Equals("A1"))
  { 
  int rxByteCount = A1Socket.EndReceive(argOr); 
  for (int i = 0; i < rxByteCount - 1; i++){a1CopyBuffer[i] = a1SocketBuffer[i]; } 
  a1BeginReceiveFlag = true;  //OK to set the Flag True again  
 
  //Some processing methods...I skipped....
 
  waitForData(CM.A1Cfg.SocketType);  //This sends us right back into the loop.  So this loop just goes on and on...till the flag kicks us out  
  }
  }
//**************************************************************************************************************//
  
So...again...my problem is when I try to close the socket..the app crashes.  I thought that by having the stopWfdloop flag...and setting it to true...I would stop the loop.  Then I could shut down and stop the sockets....but it does not work.  Here is what I do to try and shut down the socket.
 private void DisconnectButton_Click(object sender, EventArgs e)
  {
   stopWfdLoop = true;
   waitForData(CM.A1Cfg.SocketType);  //This idea here is to call the loop once...with the flag set true, to make sure the loop is shut down before we proceed
   A1Socket.Shutdown(SocketShutdown.Both);
   A1Socket.Close();
   A1Socket = null;
  stopWfdLoop = true;
  }
App dies here...
What am I missing?