代码之家  ›  专栏  ›  技术社区  ›  nop

异步/等待的方法调用的Action vs EventHandler vs Func

  •  0
  • nop  · 技术社区  · 3 年前

    我的数据库中有异步/等待的方法 Connected 匿名方法实现,我想知道在我的例子中,哪一个是最好的。我在下面举了一些例子,并根据我所知道的添加了信息。我的陈述正确吗?我还缺什么重要的东西吗?

    事件处理程序

    我唯一的缺点是,匿名方法基本上是 async void .是的,我们可以进行异步调用,但它们会有点“触发并忘记/崩溃”。

    public class Test
    {
        public event EventHandler<ConnectEventArgs>? Connected;
    
        public ValueTask StartAsync()
        {
            Connected?.Invoke(this, new ConnectEventArgs(...))
        }
    }
    
    var test = new Test();
    
    test.Connected += async (sender, e) => // private async void OnConnect(object? sender, ConnectEventArgs e) => BAD
    {
        await SendAsync(); // fire and forget
    };
    
    await test.StartAsync();
    

    Func

    我注意到,我们可以进行异步调用,而不必担心 异步无效 .我认为这是进行异步/等待方法调用的唯一好方法。不是吗?

    public class Test
    {
        public event Func<Task>? Connected;
    
        public ValueTask StartAsync()
        {
            await (Connected?.Invoke() ?? Task.CompletedTask).ConfigureAwait(false);
        }
    }
    
    var test = new Test();
    
    test.Connected += async () => // private async Task OnConnect()
    {
        await SendAsync(); // Should be okay?
    };
    
    await test.StartAsync();
    

    行动

    两者之间唯一的区别 Action EventHandler 我想到的是我们没有通过考试 发件人 我们不必创建EventArgs类。

    public class Test
    {
        public event Action<bool>? Connected;
    
        public ValueTask StartAsync()
        {
            Connected?.Invoke(true);
        }
    }
    
    var test = new Test();
    
    test.Connected += async (boolean) => // private void OnConnect(bool boolean)
    {
        await SendAsync(); // fire and forget
    };
    
    await test.StartAsync();
    
    0 回复  |  直到 3 年前