问题描述
对于允许异步操作的数据提供者,是否使用标准的异步方法?
如果不是,我该如何神化这种行为?
解决方法
我不知道你对 deify 行为的意思是什么,但大多数数据提供者都实现了同步和异步方法,例如 FileDataProvider
:
https://github.com/thepirat000/Audit.NET/blob/master/src/Audit.NET/Providers/FileDataProvider.cs
然而,数据提供者的基类从虚拟异步方法调用同步方法,所以如果自定义数据提供者没有覆盖异步方法,他们只会在新任务中调用同步方法:
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()