我有一个webservice方法getContactsAsync。我明白,当它完成它应该举起一个事件。我怎样(仍然异步)找出方法何时完成并使用结果?
public void GetContacts()
{
webService.getContactsAsync()
}
public void GetContactsCompleted(object sender, getContactsAsyncCompletedEventArgs e)
{
contacts = e.Result;
}
我不明白我应该如何使用它。我能想到的方法是调用GetContacts,然后使用while循环检查contacts!= null是否知道它何时完成。但这会锁定线程。
这种情况是否有某种典型的最佳做法? 谢谢你的阅读!
如果我完全没有,请随时解释它是如何运作的:)
答案 0 :(得分:1)
如果您通过Web Reference使用基于SOAP的Web服务,则此资源可能是故障单。
http://msdn.microsoft.com/en-us/library/wyd0d1e5%28VS.80%29.aspx
另一种可行的方法是使用您自己的后台线程中的服务同步方法。
答案 1 :(得分:1)
每个DoSomethingAsync
方法都有一个相应的DoSomethingCompleted
事件,该方法在方法完成时引发。 (有关详细信息,请参阅Event-based Asynchronous Pattern Overview。)您需要将事件处理程序方法附加到webService.GetContactsCompleted
事件,以便执行它:
public void GetContacts()
{
webService.getContactsCompleted += GetContactsCompleted;
webService.getContactsAsync();
}
// NOTE: Should be a private method.
private void GetContactsCompleted(object sender, getContactsAsyncCompletedEventArgs e)
{ /* ... */ }
(请注意,您需要确保事件处理程序仅附加一次,否则在方法完成时将多次调用它。)
答案 2 :(得分:0)
我不熟悉那种方法,听起来特定于该网络服务。但是,为了指出正确的方向,大多数Async方法都将委托作为参数,并在完成后调用该委托。
根据方法的不同,可能会有参数来调用错误,状态等。
如果没有关于您的具体情况的更具体信息,很难获得更具体的信息。
答案 3 :(得分:0)
答案 4 :(得分:0)
从你的问题中找出问题的位置有点难以理解。
您可以通过在事件处理程序中设置内容来跟踪操作何时完成。在您的示例代码中,您设置了contacts
,因此您只需检查contacts
是否为null
。
如果你想要一个完成的异步通知,比如操作完成时触发的事件,那么......呃...句柄GetContractsCompleted
,因为这正是它的用途。
如果您想要更具体的内容(例如,发出信号的WaitHandle
或操作完成时完成的Task
),那么可以完成但是更多一点工作