【发布时间】:2015-04-29 08:30:32
【问题描述】:
我有一个为我的应用程序模型提供持久层的数据存储库。所有对磁盘的访问都是异步的,所以我的整个持久层都是用 async/await 编写的。我的数据存储库允许其他模块订阅数据中的更改:
public event EventHandler<Journaling.DataChangeEventArgs> DataChanged;
protected void OnDataChanged(Journaling.Action a)
{
if (DataChanged != null)
{
DataChanged(this, new Journaling.DataChangeEventArgs(a));
}
}
当我告诉存储库删除一个被其他对象引用的对象时,它也会删除这些其他对象。
public async Task<bool> DeleteAsync(Models.BaseModel model)
{
await DeleteDependentModelsAsync(model).ConfigureAwait(false);
if (await connection.DeleteAsync(model).ConfigureAwait(false) != 1)
return false;
else
{
var deleteAction = new Journaling.DeleteAction(model);
OnDataChanged(deleteAction);
return true;
}
}
此设置在某种程度上有效,但在删除引用其他对象的对象时出现问题。考虑这个例子:
Object X
Object A1: references X
Object A2: references X
Object A3: references X
我有一个记录器模块,它订阅数据存储库中的更改并将它们输出到文件中。记录器有时需要从存储库中获取额外的数据,以使其输出可读。删除对象 X 时的日志应该是:
A1 deleted (parent: X, more information contained in X)
A2 deleted (parent: X, more information contained in X)
A3 deleted (parent: X, more information contained in X)
X deleted
问题在于 OnDataChange 不等待事件处理程序的执行。因此,数据存储库会在记录器的事件处理程序被调用一次之前删除 A1-A3,然后删除 X。但是事件处理程序必须获取有关 X 的一些信息,这不再可能,因为数据存储库已经删除了 X。
不知何故,我不得不等待 OnDataChanged 中事件处理程序的执行。这样我可以确保记录器在下一个对象从存储中删除之前完成其工作。
任何人都可以提示我如何做到这一点的正确方向吗?我曾考虑使用信号量,但这会破坏我在数据存储库和记录器之间的松散耦合。
【问题讨论】:
标签: c# events logging async-await