如何公开异步方法的事件?

时间:2010-08-28 13:58:28

标签: c# asp.net asynchronous webservice-client

我有一个webservice方法getContactsAsync。我明白,当它完成它应该举起一个事件。我怎样(仍然异步)找出方法何时完成并使用结果?

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

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

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

这种情况是否有某种典型的最佳做法? 谢谢你的阅读!

如果我完全没有,请随时解释它是如何运作的:)

5 个答案:

答案 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),那么可以完成但是更多一点工作