2014-04-15 37 views
0

我需要组织一些锁定当多个线程在未来的代码架构可以访问共享资源:C#多线程与DLL(反射)

有一个DLL什么都有它们的方法(标有一些属性)通过外部程序进行反思调用。所有这些方法都由该外部程序的几个线程同时调用。 在这个方法里面,我们引用了其他方法,它们位于另一个dll中。在另一个我们有其他DLL的方法。 外部运行程序 - (反射)> DLL - > DLL - > DLL

一切顺利,直到那一刻,当所有线程开始走在链中的最后一个DLL使用相同的资源(访问邮箱)。 一个尝试删除邮件,但另一个已经删除它等。实际上,我不关心它,如果邮件不存在,可以放入try/catch,但我不想使用此解决方案。

我在考虑添加一些锁来读取和删除操作,并使这种删除异步方式(我不关心结果,不需要等到它将完成 - 只是清理旧消息),并使用一些代码如下

lock(someObject) 
{ 
    //Access to email and delete old messages 
} 

但someObject必须在该体系结构(外部运行程序)的顶层声明,并且此参数必须被认为是所有链。很多工作,我不想这样做。

此外,我可以把这个锁在顶部程序什么运行dll方法,但需要做很多更改,因为我会失去很多时间,因为我只能锁定小部分而不是全部。

其他建议?

回答

3

体系结构建议将创建一个访问邮件资源的操作队列,以避免锁定。这将会失去对调用者的反馈,但如果需要可以异步完成。可能只是删除阶段必须排队,这取决于你想要做的确切工作。当然,这样的队列必须是安全的,并且取决于你想要的可靠性水平,可以是一个持续队列(如MSMQ)

1

我认为只要有线程间的顺序没有依赖关系(一个线程创建消息,另一个线程添加附件)。在这种情况下,Felice Pollano提到的Queue可能是一个很好的解决方案。

最后,无论您是否锁定,您都需要处理冲突。如果这些冲突是可预测的,你可以使用锁定,否则尝试抓住可能会很好。