我想为事件订阅异步方法。
然而,编译器不会让我。
我该怎么做?
示例:
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);
}
答案 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的委托。