如何声明和等待异步委托?



出于某种原因,尽管这个问题在我的谷歌搜索中出现了很多次,但我似乎找不到一个实际的答案。也许我只是用错了委托,我不确定。如果这是一个X-Y问题,我很高兴有其他方法来处理这个问题。

假设我有这个:

public class SomeLibrary
{
public delegate void OnSomethingHappened(EventInfo eventInfo);
public OnSomethingHappened onSomethingHappened;

public void SomeMethod()
{
// ...

// Something happened here, so we'd better trigger the event
onSomethingHappened?.Invoke(eventInfo);

// ...
}
}
public class MyCode
{
public void SomeInitialisationMethod()
{
SomeLibrary someLibrary = new SomeLibrary();
someLibrary.onSomethingHappened += SomeEventHandler;
}

private void SomeEventHandler(EventInfo eventInfo)
{
DoSyncProcessing(eventInfo);
}
}

应该都没问题(除非有愚蠢的打字错误)。

现在想象一下我的常规同步DoSyncProcessing函数突然必须变成异步的,就像下面这个神奇的非功能代码:

public class SomeLibrary
{
public async delegate Task OnSomethingHappened(EventInfo eventInfo); // <<< IDK what I'm doing here!
public OnSomethingHappened onSomethingHappened;

public void SomeMethod()
{
// ...

// Something happened here, so we'd better trigger the event
await onSomethingHappened?.Invoke(eventInfo);                            // <<< IDK what I'm doing here either!

// ...
}
}
public class MyCode
{
public void SomeInitialisationMethod()
{
SomeLibrary someLibrary = new SomeLibrary();
someLibrary.onSomethingHappened += SomeEventHandler;
}

private async Task SomeEventHandler(EventInfo eventInfo)
{
await DoAsyncProcessing(eventInfo);
}
}

我该如何处理呢?正确的做法是什么?

async修饰符影响的是方法实现,而不是签名。所以修改这个:

public async delegate Task OnSomethingHappened(EventInfo eventInfo);

:

public delegate Task OnSomethingHappened(EventInfo eventInfo);

和你的代码将工作

最新更新