0

100 以上の public static メソッドを持つクラスがあり、毎回 1 つの static 呼び出しを制限したいのですが、数行のコードでこれを達成するためのトリックはありますか? これを達成するためのクラス属性が好きですか?

このような:

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

一度にアクセスできる静的メソッド呼び出しは 1 つだけです。メソッド 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
4

3 に答える 3

0

この問題は、各静的関数にクリティカル コードがあり、一度に 1 つの関数だけが実行される単純なクリティカル セクション問題に縮小できます。これで、セマフォなど、この問題を解決するための標準的な方法を使用できます。関数を実行する前にロックを取得し、実行後にロックを解除して、待機中の他の関数を実行できるようにします。あなたの場合、バイナリセマフォがその仕事をします。

于 2013-06-03T05:59:31.140 に答える
0
// 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 キーワードを使用して) 1 回だけインスタンス化できる静的オブジェクトを作成し、一度に 1 つずつ実行されるすべてのメソッドでその静的オブジェクトにロック ステートメントを追加することです。

于 2013-06-03T04:04:02.243 に答える