什么是默认行为 InsertEvent 或 InsertEventAsync

问题描述

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

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

解决方法

我不知道你对 deify 行为的意思是什么,但大多数数据提供者都实现了同步和异步方法,例如 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() 上调用 SaveAsync()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",null))
{
    target.Status = "Updated";
} // <---- DisposeAsync() will call InsertEventAsync()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...