title: Manually unpinning a byte[] in C#?
body: <p>In the following code, it seems that the client.Connect.Receive is pinning the "byte[] result" permanently, causing the memory to never be freed (as it's always pinned).  I'm looking for a way to tell C# that result no-longer needs to be pinned after it's usage in this.OnReceive, but I can't find the built-in function or keyword to do this.</p>
  
  <p>Does anyone know how I can get C# to unpin the byte[] array? (this is one of the sources of memory leaks in my C# application)</p>
  
  <pre><code>this.m_TcpListener = new TcpListener(this.p_TcpEndPoint.Port);
  this.m_TcpThread = new Thread(delegate()
  {
      try
      {
          this.m_TcpListener.Start();
          while (this.p_Running)
          {
              TcpClient client = this.m_TcpListener.AcceptTcpClient();
              new Thread(() =&gt;
                  {
                      try
                      {
                          // Read the length header.
                          byte[] lenbytes = new byte[4];
                          int lbytesread = client.Client.Receive(lenbytes, 0, 4, SocketFlags.None);
                          if (lbytesread != 4) return; // drop this packet :(
                          int length = System.BitConverter.ToInt32(lenbytes, 0);
                          int r = 0;
  
                          // Read the actual data.
                          byte[] result = new byte[length];
                          while (r &lt; length)
                          {
                              int bytes = client.Client.Receive(result, r, length - r, SocketFlags.None);
                              r += bytes;
                          }
  
                          Console.WriteLine("Received TCP packet from " + (client.Client.RemoteEndPoint as IPEndPoint).Address.ToString() + ".");
                          this.OnReceive(client.Client.RemoteEndPoint as IPEndPoint, result, length);
                      }
                      catch (SocketException)
                      {
                          // Do nothing.
                      }
  
                      client.Close();                                
                  }).Start();
              //this.Log(LogType.DEBUG, "Received a message from " + from.ToString());
          }
      }
      catch (Exception e)
      {
          if (e is ThreadAbortException)
              return;
          Console.WriteLine(e.ToString());
          throw e;
      }
  }
  );
  this.m_TcpThread.IsBackground = true;
  this.m_TcpThread.Start();
  </code></pre>