首页 > 解决方案 > 什么是默认行为 InsertEvent 或 InsertEventAsync

问题描述

对于允许异步操作的数据提供者,是否使用标准的异步方法?

如果不是,我该如何神化这种行为?

标签: audit.net

解决方案


我不确定你所说的神化行为是什么意思,但大多数数据提供者都实现了同步和异步方法,例如FileDataProvider

https://github.com/thepirat000/Audit.NET/blob/master/src/Audit.NET/Providers/FileDataProvider.cs

但是,数据提供者的基类从虚拟异步方法中调用同步方法,因此如果自定义数据提供者不覆盖异步方法,它们只会在新任务中调用同步方法:

https://github.com/thepirat000/Audit.NET/blob/8d410cb919f09d0c35f7c622d2e21913bcc46c59/src/Audit.NET/AuditDataProvider.cs#L58

public virtual async Task<object> InsertEventAsync(AuditEvent auditEvent)
{
    // Default implementation calls the sync operation
    return await Task.Factory.StartNew(() => InsertEvent(auditEvent));
}

调用哪一个取决于上下文。如果你在 上调用Save()orSaveAsync()方法AuditScope,它将分别调用同步或异步版本。Dispose()/DisposeAsync()方法也是如此。

考虑以下示例:

Audit.Core.Configuration.Setup()
    .UseSqlServer(sql => sql....)
    .WithCreationPolicy(EventCreationPolicy.InsertOnEnd);

using (var scope = AuditScope.Create("test", () => target, null))
{
    target.Status = "Updated";
} // <---- Dispose() will call InsertEvent()

await using (var scope = await AuditScope.CreateAsync("test", () => target, null))
{
    target.Status = "Updated";
} // <---- DisposeAsync() will call InsertEventAsync()

推荐阅读