Async / Await使用委托

时间:2013-12-09 14:17:30

标签: c# events async-await

我想为事件订阅异步方法。

然而,编译器不会让我。

我该怎么做?

示例:

class SearchBase
{
    public delegate void ReuestingCollectionHandler();
    public event ReuestingCollectionHandler RequestingCollection = null;
}
.
.
.
SearchBase.RequestingCollection += LoadCandidates;


 public async Task LoadCandidates()
 {
    var queryText = string.Empty;
    Candidates = await CandidatesManager.GetCandidates(Profile.Instance.RecruiterId);
 }

2 个答案:

答案 0 :(得分:3)

您的LoadCandidates方法是否仅用作事件处理程序(如您发布的代码所示)?

如果是,则应将其更改为async void,而不是返回Task。这是事件处理程序的常用签名,并且可以接受/推荐使用async void方法的极少数情况之一。

如果您要在其他地方使用它并且需要它来返回任务,那么在它周围编写一个async void包装器方法,并使用此包装器作为事件处理程序。

public async void LoadCandidatesAsync()
 {
    await LoadCandidates();
 }

事件处理程序应 NOT 返回任何内容。如果调用者有100个客户端正在侦听该事件,那么他只会获得其中一个处理程序的返回值。 如果调用者想要从处理程序中获取某些东西,那么它应该向它们发送一个可变的EventArgs实例。

以下是有关事件处理程序返回void的原因的更完整说明:https://stackoverflow.com/a/3325425/857807

答案 1 :(得分:1)

您的委托需要匹配,您不能将返回任务的方法分配给返回类型为void的委托。