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 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.
And there's apparently an error in methodB:

```
 foreach (ServiceReference1.ObjectA obj in products)
    {
        ObjectAtemp = new ObjectA(obj);
         // no temp -- there should be a space between ObjectA and temp in the line above
         // perhaps just a typo here on SO? or in the original code?
         // EDIT: I see the code in methodB has now been corrected.
         _OurObjectA.Add(temp);
    }

```