C# 如何公开异步方法';什么事?

C# 如何公开异步方法';什么事?,c#,asp.net,asynchronous,webservice-client,C#,Asp.net,Asynchronous,Webservice Client,我有一个webservice方法getContactsAsync。我明白,当它完成时,它应该引发一个事件。我如何(仍然异步地)找出方法何时完成并使用结果 public void GetContacts() { webService.getContactsAsync() } public void GetContactsCompleted(object sender, getContactsAsyncCompletedEventArgs e) { contacts = e.Res

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

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

public void GetContactsCompleted(object sender, getContactsAsyncCompletedEventArgs e)
{
    contacts = e.Result;
}
我不知道该怎么用这个。我能想到的方法是调用GetContacts,然后使用while循环检查contacts!=null以知道它何时完成。但这会锁住线

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


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

我不熟悉这种方法,听起来是该web服务特有的。然而,为了向您指出正确的方向,大多数异步方法都将委托作为参数,并在完成委托后调用该委托

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


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

如果您通过web引用使用基于SOAP的web服务,则此资源可能就是问题所在


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

请看。

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

通过在事件处理程序中设置某些内容,可以跟踪操作何时完成。在示例代码中,您正在设置
联系人
,因此您可以只检查
联系人
是否为

如果您想要异步完成通知,如操作完成时触发的事件,则。。。呃。。。处理
GetContractsCompleted
,因为这正是它的目的


如果您想要更具体的东西(例如,发出信号的
WaitHandle
,或操作完成时完成的
任务
),然后可以这样做,但这需要更多的工作。

每个
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)
{ /* ... */ }

(请注意,您需要确保事件处理程序只附加一次,或者在方法完成后将开始多次调用。)

他似乎使用的是基于事件的异步模式,而不是APM模式;这会在完成时引发一个事件,而不是执行异步回调。我编辑了我的问题,因为我越来越意识到我的问题是什么以及我想完成什么。大卫回答了我最初的问题,这个问题充其量也有点困惑。我仍然对这一切感到困惑,但我正在学习。如何确保事件处理程序只连接一次?某种单身模式?谢谢大家!您可以通过在实例化
webService
对象(例如,在这个类的构造函数中)之后立即附加它来确保它只发生一次。