可以编辑下面的代码,使第二个方法也被执行吗?
本文关键字:方法 第二个 执行 编辑 代码 | 更新日期: 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);
}