2011-04-06 41 views
2

有没有方法A完成之前调用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); 
    } 
} 

回答

1

它分配方法methodB作为事件getProductCompleted。当一个事件处理程序该事件由所述client变量凸起,该事件处理程序被执行

UPDATE:
更新我的回答居然回答你的问题...
您可以使用此代码,从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。

+0

感谢您编辑我的代码:)所以我想如果methodA被调用,那么它会自动调用methodB?但不知何故,它不被称为。无论如何将这两种方法结合(1种方法)?谢谢:) – RKM 2011-04-06 13:56:02

+0

只有在事件引发时才会调用methodB。正如Giovanni解释的那样,在webservice完成其工作之后,会发生这种情况。这可能会在methodA完成执行后很长时间发生。 – 2011-04-06 13:57:42

+0

哦......谢谢。无论如何解决这个问题?因为我想在方法A完成时返回ObjectA的列表:) – RKM 2011-04-06 14:06:14

6

它看起来像methodA调用一个Web服务。当Web服务完成时,它调用methodB。令人困惑的部分是,这是asynchronous(通过事件处理程序)... methodA立即返回;它不必等待Web服务完成。

这可能是因为服务需要很长时间(相对来说),所以在这种情况下,您可以立即从methodA返回,做一些其他的工作,并且当web服务完成时,methodB可以做到这些从Web服务返回的数据。这是更有效地利用资源。有时候,这种事情是这样完成的,以至于UI看起来不像是“挂起来”。

+0

非常感谢。是的,这是一个带WCF服务的Silverlight应用程序。当我运行这段代码时,MethodB似乎永远不会被执行,它只是跳过这部分,然后浏览器出现错误,并且整个应用程序,我猜这是因为它是异步的?无论如何解决这个问题?谢谢:) – RKM 2011-04-06 14:01:31

0

而且很显然有一个错误的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); 
    } 
+0

感谢您的发现。这是从我复制代码。 :) – RKM 2011-04-06 14:02:14

1

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

+0

谢谢!我意识到methodB只在服务完成后才被调用,到时候它已经太晚了,浏览器已经完成加载信息。 :( – RKM 2011-04-06 15:01:47

相关问题