当多个线程在下一代码架构中访问公共资源时,我需要组织一些锁定:
有一个dll有外部程序反射调用的方法(用某些属性标记)。所有这些方法都由来自该外部程序的多个线程同时调用。 在这个方法中,我们引用了另一个dll中的其他方法。在另一个内部我们有来自其他dll的方法。 外部运行程序 - (反射)> dll - > dll - > DLL
直到所有线程开始使用链中最后一个dll的相同资源(访问电子邮箱)时,一切都还可以。 一个尝试删除消息,但另一个已经删除它等。事实上我不关心它,如果消息不存在,可以把try / catch但我不想使用这个解决方案。
我正在考虑添加一些锁来读取和删除操作并使这种删除异步方式(我不关心结果,也不需要等到它完成 - 只是清理旧消息)并使用一些代码如下所示
lock(someObject)
{
//Access to email and delete old messages
}
但someObject必须在该体系结构的顶层声明(外部运行程序),并且必须通过所有链传递此参数。很多工作,我不想这样做。
此外,我可以把这个锁定在顶级程序运行dll方法,但是还需要做很多更改,因为我会浪费很多时间,因为我只能锁定小部分而不是全部。
还有其他建议吗?
答案 0 :(得分:3)
架构建议是创建访问邮件资源的操作队列,以避免锁定。这将松散调用者的反馈,但如果需要,可以异步完成。可能只是删除阶段必须排队,这取决于你想要做的确切工作。当然这样的队列必须是安全的,并且根据你想要的可靠性级别,可以是一个持久队列(如MSMQ)
答案 1 :(得分:1)
我认为你提出的try catch解决方案很好,只要线程之间没有依赖关系(一个线程创建一个消息,另一个线程添加一个附件)。在那种情况下,Felice Pollano提到的队列可能是一个很好的解决方案。
最后,无论你是否锁定,你都需要处理冲突。如果这些冲突是可预测的,你可以使用锁定,否则尝试catch可能就好了。