2013-06-03 42 views
0

我有100 +一類 -公共靜態方法和我想限制每次一個靜態呼叫,是否有任何與幾行代碼實現這個訣竅? 像一些類屬性來實現這一點?C#限制在一個類中的每個時間100+靜態方法(解決)一個靜態調用

像這樣:

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

只有一個靜態方法調用是在同一時間訪問。當方法B正在調用時,必須阻止對其他方法的調用,直到方法B返回;

對不起,我似乎有一些誤導性的標題。我的真正目的是找到一種減少編碼的方法,以達到與通過向每個功能添加鎖定統計的結果相同的結果。無論如何,我解決了這個問題,最後加入了 statment給每個函數,但是使用下面的marco爲我做了重複的工作。

'' 
'' 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 
+0

你是什麼意思完全相同?你能提供一個例子嗎? –

+0

在該方法上使用[MethodImpl(MethodImplOptions.Synchronized)]屬性。 (http://stackoverflow.com/questions/2223656/what-does-methodimploptions-synchronized-do) –

+0

@DarrenKopp謝謝。但是我想防止同時調用不同的靜態方法,而不僅僅是一種方法。 – Sandro

回答

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 
    } 
    } 

的想法是創建可以僅實例化一次(通過只讀關鍵字)的靜態對象,並在其中是在一個時間被執行的一個的所有方法加靜態對象上鎖定語句

+0

我認爲upvoting這是它包含的不僅僅是代碼。如何解釋一些文字? –

0

此問題可以簡化爲一個簡單的臨界區問題,其中每個靜態函數都有關鍵代碼,並且每次只能運行一個函數。 現在您可以使用任何標準方法來解決像信號量這樣的問題。在執行一個函數之前獲取鎖並在執行後釋放鎖,以便可以執行正在等待的其他函數。 二進制信號將在你的情況下完成這項工作。

1

您可以將以下屬性添加到每個靜態方法:

[MethodImpl(MethodImplOptions.Synchronized)] 

對於靜態方法,這相當於將下面的構造中的每個靜態方法:

lock (typeof(Test)) 
{ 
    ... 
} 
相關問題