2014-05-13 27 views
1

我有一種方法,我希望只有一個用戶可以一次訪問。我真的不知道該怎麼做。如何使一個用戶可以在c中同時訪問一個方法#

public static int add(int a, int b) 
{ 
int c = a+b; 
return c; 
} 

我在用戶在兩個文本框中輸入數據並在asp.net網頁上單擊提交按鈕時調用此方法。 我不希望其他用戶訪問被拒絕。他們應該保持在某種排隊狀態,並且當方法完成時服務一個用戶應該服務下一個用戶。

+2

您的意思是它必須是線程安全的?使用你的.NET同步機制之一,例如一個鎖(但我們不能從這樣的虛構例子中說出,爲什麼你必須這樣做?你訪問共享資源還是靜態變量?) –

+2

Define「one用戶「......因爲ASP.NET可能跨越多個應用程序域(在回收期間)或多臺機器(服務器場) - 這需要多嚴格?同一個用戶可以向該方法發出多個併發http請求嗎?這裏的「用戶」是否真的意味着「請求」?那麼重入電話呢? **什麼是我們試圖通過限制訪問來保護**(這是問題的重要背景;沒有必要對所示方法做任何事情,因爲沒有共享狀態) –

+0

@Adriano是我正在使用共享資源,並且一次可以提供一個用戶 – user3202862

回答

2

:資源下載得到很好的解釋,查閱文檔。 Thread Synchronization

既然你有一個靜態方法,你需要靜態的Object進行鎖定。

public class Calculator 
{ 
    private static System.Object lockThis = new System.Object(); 

    public static void Add(int a, int b) 
    { 
     lock (lockThis) 
     { 
      return a+b; 
     } 
    } 

} 

lock手段,每當一個線程訪問該方法,它沒有被鎖定,它將鎖定和運行代碼。如果它被鎖定,它將不會做任何事情,直到它被解鎖。編號: 您的方法的編輯代碼。

+0

如果其他用戶同時發送請求會發生 – user3202862

+0

@ user3202862不會因爲第一個線程鎖定了該方法,這意味着其他線程在那段時間內將無法訪問該方法。 –

+0

如何存儲其他用戶數據,然後在免費時將該數據發送到此方法 – user3202862

0

假設這種方法是一個單獨的對象中,那麼你將需要synchronize the method

+0

由於它是一種「靜態」方法,所以不可能說它在* any *對象,單例或其他方式中是什麼 –

0

您將需要一個靜態對象,並使用關鍵字鎖定。

private static object locker = new object(); 
public static int add(int a, int b) 
{ 
    lock(locker) 
    { 
     //do stuff 
    } 
} 
相關問題