我的数据库中有异步/等待的方法
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();