目前,我有一些看起来像这样的功能:
private bool inFunction1 = false; public void function1() { if (inFunction1) return; inFunction1 = true; // do stuff which might cause function1 to get called ... inFunction1 = false; }
我希望能够像这样声明它们:
[NoReEntry] public void function1() { // do stuff which might cause function1 to get called ... }
是否有可以添加到函数中的属性以防止重新进入?如果没有,我将如何制作一个?我听说过可以用来在函数调用之前和之后添加代码的AOP属性; 他们会适合吗?
不要使用bool并直接设置它,请尝试使用long和Interlocked类:
long m_InFunction=0; if(Interlocked.CompareExchange(ref m_InFunction,1,0)==0) { // We're not in the function try { } finally { m_InFunction=0; } } else { // We're already in the function }
这将使检查线程安全.
如果没有汇编和IL重写,则无法创建以您描述的方式修改代码的自定义属性.
我建议您使用基于委托的方法,例如,对于单个参数的函数:
static FuncWrapAgainstReentry (Func code, Func onReentry) { bool entered = false; return x => { if (entered) return onReentry(x); entered = true; try { return code(x); } finally { entered = false; } }; }
此方法采用函数进行换行(假设它匹配Func