C#在一个具有100+静态方法的类中每次限制一个静态调用

本文关键字:一个 静态 调用 100+ 静态方法 | 更新日期: 2023-09-27 18:16:26

我有一个带有100+-公共静态方法的类,我想每次限制一个静态调用,用几行代码实现这一点有什么技巧吗像一些类属性来实现这一点?

像这样:

public class Test
{
    public static void A() { }
    public static void B() { }
    public static void C() { }
    public static void D() { }
}

一次只能访问一个静态方法调用。当方法B正在调用时,必须阻止对其他方法的调用,直到方法B返回;

对不起,我似乎发布了一些误导性的标题。我的真正目的是找到一种减少编码的方法,通过向每个函数添加lock语句来实现相同的结果


已解决

最后,我通过向每个函数添加语句来解决问题,但使用以下宏为我做重复工作。

''
'' edit from Code outlining sample.
''
Sub LoopFunction()
    Dim i As Integer
    Dim fileCM As FileCodeModel
    Dim elts As EnvDTE.CodeElements
    Dim elt As EnvDTE.CodeElement
    fileCM = DTE.ActiveDocument.ProjectItem.FileCodeModel
    elts = fileCM.CodeElements
    For i = 1 To elts.Count
        elt = elts.Item(i)
        EditFunction(elt)
    Next
End Sub
Sub EditFunction(ByVal elt As EnvDTE.CodeElement)
    If (elt.Kind = EnvDTE.vsCMElement.vsCMElementNamespace) Then
        Dim i As Integer
        Dim mems As EnvDTE.CodeElements
        mems = elt.Members
        For i = 1 To mems.Count
            EditFunction(mems.Item(i))
        Next
    ElseIf (elt.Kind = vsCMElement.vsCMElementClass) Then
        Dim i As Integer
        Dim mems As EnvDTE.CodeElements
        mems = elt.Members
        For i = 1 To mems.Count
            EditFunction(mems.Item(i))
        Next
    ElseIf (elt.Kind = vsCMElement.vsCMElementFunction) Then
        Dim epStart As EnvDTE.EditPoint
        Dim epEnd As EnvDTE.EditPoint
        Dim textSelection As EnvDTE.TextSelection
        epStart = elt.GetStartPoint(vsCMPart.vsCMPartBody).CreateEditPoint()
        epEnd = elt.GetEndPoint(vsCMPart.vsCMPartBody).CreateEditPoint()
        textSelection = DTE.ActiveDocument.Selection
        textSelection.MoveToPoint(epEnd)
        textSelection.Insert(NewLine & "}" & NewLine)
        textSelection.MoveToPoint(epStart)
        textSelection.Insert(NewLine & "lock(lockTest){" & NewLine)
    End If
End Sub

C#在一个具有100+静态方法的类中每次限制一个静态调用

您可以为每个静态方法添加以下属性:

[MethodImpl(MethodImplOptions.Synchronized)]

对于静态方法,这相当于在每个静态方法中放置以下构造:

lock (typeof(Test))
{
    ...
}

这个问题可以简化为一个简单的关键部分问题,其中每个静态函数都有关键代码,并且一次只能运行一个函数。现在,您可以使用任何标准的方法来解决这个问题,比如信号量。在执行一个函数之前获取锁,在执行之后释放锁,以便其他正在等待的函数可以执行。二进制信号量将在您的情况下完成这项工作。

// Static object that can only be instantiated once per class
private readonly static lockObj = new object();
 public static void A() {
     lock(lockObj){
       //.. your code here
     }
    }
 public static void B() {
     lock(lockObj){
       //.. your code here
     }
    }
  public static void C() {
     lock(lockObj){
       //.. your code here
     }
    }
  public static void D() {
     lock(lockObj){
       //.. your code here
     }
    }

这个想法是创建一个只能实例化一次的静态对象(通过readonly关键字(,并在所有要一次执行一个的方法中对该静态对象添加锁语句