Question: Is there anyway of calling methodB before methodA finishes, so that methodB gets executed? Ive tried numerous ways of implementing it, and none of them worked :(

---

can someone explain? Thanks.

```
public List<ObjectA> _OurObjectA= new List<ObjectA>();

public  List<ObjectA> methodA()
{

    List<ObjectA> products = new List<ObjectA>();
    ServiceReference1.ServiceClient client = 
      new ServiceReference1.ServiceClient();
    client.getProductCompleted += 
      new EventHandler<ServiceReference1.getProductCompletedEventArgs>(methodB);

    client.getProductAsync();

    return _OurObjectA;
}

void methodB(object sender, ServiceReference1.getProductCompletedEventArgs e)
{
    ObservableCollection<ServiceReference1.ObjectA> products = e.Result;
    foreach (ServiceReference1.ObjectA obj in products)
    {
        ObjectA temp = new ObjectA(obj);
        _OurObjectA.Add(temp);
    }
}

```

Answer: 
It looks like methodA calls a web service. When the web service is done it calls methodB. The confusing part is that this is [asynchronous](http://en.wikipedia.org/wiki/Asynchronous_I/O) (via the event handler)... methodA returns right away; it doesn't have to wait for the web service to finish.

This was probably done because the service takes a long time (relatively speaking), so in this case you can return from methodA right away, do some other work, and when the web service is done methodB can do it's stuff with the data returned from the web service. This is a more efficient use of resources. Sometimes this sort of thing is done so that the UI doesn't look like it's "hanging."
It assigns the method `methodB` as an event handler for the event `getProductCompleted`. When the event is raised by the `client` variable, the event handler is executed.

**UPDATE:**  

I update my answer to actually answer your question...  

You can use this code, to return from `methodA` after the products have been returned:

```
public  List<ObjectA> methodA()
{
    var products = new List<ObjectA>();
    var mre = new ManualResetEvent(false);
    var client = new ServiceReference1.ServiceClient();
    client.getProductCompleted += (s, e) => {
                                               try
                                               {
                                                   products.AddRange(
                                                       e.Result.Select(o => 
                                                            new ObjectA(o)));
                                               }
                                               finally
                                               {
                                                   mre.Set();
                                               }
                                            };

    client.getProductAsync();
    mre.WaitOne();

    return products;
}

```

You don't even need methodB in that case.  

The code assumes, you are using at least .NET 3.5.