1

我有一个网络服务方法 getContactsAsync。我已经明白,当它完成时,它应该引发一个事件。我如何(仍然异步)找出方法何时完成并使用结果?

public void GetContacts()
{
    webService.getContactsAsync()
}

public void GetContactsCompleted(object sender, getContactsAsyncCompletedEventArgs e)
{
    contacts = e.Result;
}

我不明白我应该如何使用它。我能想到的方法是调用 GetContacts,然后使用 while 循环检查是否联系人!= null 以了解它何时完成。但这会锁定线程。

对于这种情况,是否有某种典型的最佳实践?谢谢阅读!

如果我完全不了解它,请随时解释它的实际工作原理:)

4

5 回答 5

1

每个DoSomethingAsync方法都有一个相应的DoSomethingCompleted事件,该事件在方法完成时引发。(有关更多信息,请参阅基于事件的异步模式概述。)您需要将事件处理程序方法附加到webService.GetContactsCompleted事件才能执行它:

public void GetContacts()
{
    webService.getContactsCompleted += GetContactsCompleted;
    webService.getContactsAsync();
}

// NOTE: Should be a private method.
private void GetContactsCompleted(object sender, getContactsAsyncCompletedEventArgs e)
{ /* ... */ }

(请注意,您需要确保事件处理程序只附加一次,否则当方法完成时它将开始多次调用。)

于 2010-08-29T05:37:05.070 回答
1

如果您通过 Web Reference 使用基于 SOAP 的 Web 服务,则此资源可能就是票证。

http://msdn.microsoft.com/en-us/library/wyd0d1e5%28VS.80%29.aspx

另一种可行的方法是在您自己的后台线程中使用服务的同步方法。

于 2010-08-28T14:31:58.977 回答
0

我不熟悉那种方法,听起来特定于那个网络服务。但是,为了给您指明正确的方向,大多数 Async 方法都将委托作为参数,并在完成后调用该委托。

根据方法的不同,可能会有参数来调用错误、状态等。

如果没有关于您的情况的更具体信息,很难得到比这更具体的信息。

于 2010-08-28T14:19:27.227 回答
0

从您的问题中找出问题所在有点困难。

您可以通过在事件处理程序中设置某些内容来跟踪操作何时完成。在您的示例代码中,您正在设置contacts,因此您可以检查 if contactsis null

如果您想要完成的异步通知,例如在操作完成时触发的事件,那么...呃... handle GetContractsCompleted,因为这正是它的用途。

如果您想要更具体的内容(例如,WaitHandle发出信号或Task在操作完成时完成),那么可以完成,但需要做更多的工作。

于 2010-08-28T17:46:09.800 回答
0

看看Calling Web Services Asynchronously

于 2010-08-28T16:20:27.650 回答