我正在设计一个基类,当它被继承时,它将在多线程环境中针对上下文提供业务功能。每个实例都可能有长时间运行的初始化操作,所以我想让对象可重用。为此,我需要能够:
- 将上下文分配给这些对象之一以允许其完成工作
- 防止对象在已有上下文时被分配新上下文
- 防止在对象没有上下文时访问某些成员
此外,每个上下文对象可以由许多工作对象共享。
是否有适合我想要做的正确同步原语?这是我想出的最适合我需要的模式:
private Context currentContext;
internal void BeginProcess(Context currentContext)
{
// attempt to acquire a lock; throw if the lock is already acquired,
// otherwise store the current context in the instance field
}
internal void EndProcess()
{
// release the lock and set the instance field to null
}
private void ThrowIfNotProcessing()
{
// throw if this method is called while there is no lock acquired
}
使用上述内容,我可以保护不应访问的基类属性和方法,除非对象当前处于处理状态。
protected Context CurrentContext
{
get
{
this.ThrowIfNotProcessing();
return this.context;
}
}
protected void SomeAction()
{
this.ThrowIfNotProcessing();
// do something important
}
我最初的目的是使用Monitor.Enter
和相关的功能,但这并不能阻止同线程重入(BeginProcess
对原始线程的多次调用)。