Listing 2

struct network_block
{
  string get_page(string url, int port, bool secure)
  {
    // ... fetch the page 
    return "<html>...</html>"; 
  }
};
struct result_callback : public async_callback<string>
{
  void accept_result(const string& s)
  {
    // show result
  }
};

int main(int argc, char* argv[])
{
  thread_pool workers(5);
  network_block nb;
  result_callback rc;

  typedef delegate<string, mpl::vector<string, int, bool> > async_get_page;
  async_get_page agp(&nb, &network_block::get_page);
  // 1. synchronously wait
  async_result ar1 = agp.begin_invoke("http...", 80, false);
  string res1 = agp.end_invoke(ar1);
  // 2. wait on async result
  async_result ar2 = agp.begin_invoke("ftp...", 21, false);
  ar2.wait();
  string result2 = agp.end_invoke(ar2);
  // 3. loop waiting for completed flag
  async_result ar3 = agp.begin_invoke("https...", 81, true);
  while(!ar3.is_completed())
    thread::yield();
  string result3 = agp.end_invoke(ar3);
  // 4. use async callback for result
  async_result ar4 = agp.begin_invoke("http...", 82, false, &rc);
  // 5. brute force launch hundreds of calls
  for(int i = 1000; i < 1100; ++i)
    agp.begin_invoke("gopher...", i, false);
  return 0;
}