可以编辑下面的代码,使第二个方法也被执行吗?

本文关键字:方法 第二个 执行 编辑 代码 | 更新日期: 2023-09-27 17:49:15

是否在methodA完成之前调用methodB,以便methodB得到执行?我尝试了很多实现它的方法,但没有一个奏效:(


有人能解释一下吗?谢谢。
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);
    }
}

可以编辑下面的代码,使第二个方法也被执行吗?

看起来像是methodA调用了一个web服务。当web服务完成后,它调用methodB。令人困惑的部分是,这是异步的(通过事件处理程序)…methodA立即返回;它不需要等待web服务完成。

这可能是因为服务需要很长时间(相对而言),所以在这种情况下,你可以立即从methodA返回,做一些其他的工作,当web服务完成时,methodB可以用从web服务返回的数据做它的东西。这是对资源的更有效利用。有时这样做是为了让UI看起来不像"挂起"。"

您的客户端对象有一个名为getProductCompleted的事件。当发布该事件时,执行methodB。getproductasync()是一个异步调用,这意味着它将在后台开始下载产品,尽管该方法将立即返回。当产品下载完成后,客户端发布事件,导致methodB被执行。

将方法methodB分配为事件getProductCompleted的事件处理程序。当事件由client变量引发时,执行事件处理程序。

更新:
我更新了我的答案,以实际回答你的问题…
您可以使用以下代码,在产品返回后从methodA返回:

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;
}

在这种情况下,你甚至不需要methodB。
代码假定您至少使用。net 3.5。

显然在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);
    }