使用委托异步/等待

Sco*_*rod 0 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);
 }
Run Code Online (Sandbox Code Playgroud)

dca*_*tro 5

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

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

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

public async void LoadCandidatesAsync()
 {
    await LoadCandidates();
 }
Run Code Online (Sandbox Code Playgroud)

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

以下是关于为什么事件处理程序应该返回的更完整的解释void/sf/answers/232779781/

  • 请记住,这样做意味着当您引发事件时,处理程序可能会并行执行,并且您不会知道它们何时完成。 (2认同)