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

Clo*_*kex 5 c# delegates asynchronous async-await

出于某种原因,尽管这个问题在我的谷歌搜索中出现了很多,但我似乎找不到真正的答案。也许我只是错误地使用了代表,我不确定。如果这是一个 XY 问题,我很高兴有其他方法来处理这个问题。

假设我有这个:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该没问题(除非有愚蠢的拼写错误)。

现在想象一下我的常规同步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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我该如何处理?这样做的正确方法是什么?

Joh*_*ica 12

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

public async delegate Task OnSomethingHappened(EventInfo eventInfo);
Run Code Online (Sandbox Code Playgroud)

对此:

public delegate Task OnSomethingHappened(EventInfo eventInfo);
Run Code Online (Sandbox Code Playgroud)

你的代码将会工作。