当前位置:  开发笔记 > 编程语言 > 正文

我可以向函数添加属性以防止重新进入吗?

如何解决《我可以向函数添加属性以防止重新进入吗?》经验,为你挑选了2个好方法。

目前,我有一些看起来像这样的功能:

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属性; 他们会适合吗?



1> Sean..:

不要使用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
}

这将使检查线程安全.


您的Win32 api被定义为采用int32,如果您使用C++来定位Win32,则int和long都定义为int32.而且......好吧,你不在乎.
没有特别的原因.我用它做了很多Win32编程,并且互锁功能需要很长时间.在上面的例子中使用int不会有任何区别.

2> Barry Kelly..:

如果没有汇编和IL重写,则无法创建以您描述的方式修改代码的自定义属性.

我建议您使用基于委托的方法,例如,对于单个参数的函数:

static Func WrapAgainstReentry(Func code, Func onReentry)
{
    bool entered = false;
    return x =>
    {
        if (entered)
            return onReentry(x);
        entered = true;
        try
        {
            return code(x);
        }
        finally
        {
            entered = false;
        }
    };
}

此方法采用函数进行换行(假设它匹配Func - 您可以编写其他变体,或者更加努力地完全通用的版本)以及在重新进入的情况下调用的备用函数.(备用函数可能抛出异常,或立即返回等)然后,在通常调用传递方法的代码中,调用WrapAgainstReentry()返回的委托.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有