title: WCF: How can I send data while gracefully closing a connection?
body: <p>I've got a WCF service that offers a Login method. A client is required to call this method (due to it being the only IsInitiating=true). This method should return a string that describes the success of the call in any case. If the login failed, the connection should be closed.</p>
  
  <p>The issue is with the timing of the close. I'd like to send the return value, then immediately close the connection.</p>
  
  <pre><code>string Login (string name, string pass)
  {
      if (name != pass) {
          OperationContext.Current.Channel.Close ();
          return "fail";
      }
      else {
          return "yay";
      }
  }
  </code></pre>
  
  <p>The <a href="http://msdn.microsoft.com/en-us/library/ms195520(v=VS.100).aspx?appId=Dev10IDEF1&amp;l=EN-US&amp;k=k(SYSTEM.SERVICEMODEL.ICOMMUNICATIONOBJECT.CLOSE);k(TargetFrameworkMoniker-%22.NETFRAMEWORK&amp;k=VERSION=V4.0%22);k(DevLang-CSHARP)&amp;rd=true" rel="nofollow noreferrer">MSDN</a> states that calling <code>Close</code> on the channel</p>
  
  <blockquote>
    <p>causes an ICommunicationObject to
    gracefully transition from the Opened
    state to the Closed state. The Close
    method allows any unfinished work to
    be completed before returning. For
    example, finish sending any buffered
    messages).</p>
  </blockquote>
  
  <p>This did not work for me (or my understanding is wrong), as the close is executed immediately - WCF does not wait for the Login method to finish executing and return a string but closes the connection earlier.</p>
  
  <p>Therefore I assume that calling Close does not wait for the running method to finish. Now, how can I still return a value, <em>then</em> close?</p>
  
  <p>In my desperation I tried the following, but it is hardly a serious solution.</p>
  
  <pre><code>new Thread (() =&gt; {
      Thread.Sleep (100);
      OperationContext.Current.Channel.Close ();
  }).Start ();
  </code></pre>