2011-02-27 106 views
3

我想重現HTTP處理程序中的線程錯誤條件。c#同時執行2個線程

基本上,ASP.net工作人員程序正在創建2個線程,在加載某個頁面時同時在我的應用程序中調用HTTP處理程序。

在http處理程序中,是一個不是線程安全的資源。因此,當2個線程同時嘗試訪問它時會發生異常。

我可能會在資源周圍放置一個鎖定語句,但是我想確保事實如此。所以我想先在控制檯應用程序中創建情況。

但我不能得到2線程執行一個方法在同一時間像asp.net wp。所以,我的問題是如何創建2個線程可以同時執行一個方法。

編輯:

底層的資源是與用戶表中的SQL數據庫(只有一個名字列)。這是我嘗試過的示例代碼。

[TestClass] 
    public class UnitTest1 
    { 
     [TestMethod] 
     public void Linq2SqlThreadSafetyTest() 
     { 
      var threadOne = new Thread(new ParameterizedThreadStart(InsertData)); 
      var threadTwo = new Thread(new ParameterizedThreadStart(InsertData)); 

      threadOne.Start(1); // Was trying to sync them via this parameter. 
      threadTwo.Start(0); 

      threadOne.Join(); 
      threadTwo.Join(); 
     } 


     private static void InsertData(object milliseconds) 
     { 
      // Linq 2 sql data context 
      var database = new DataClassesDataContext(); 

      // Database entity 
      var newUser = new User {Name = "Test"}; 

      database.Users.InsertOnSubmit(newUser); 

      Thread.Sleep((int) milliseconds); 

      try 
      { 
       database.SubmitChanges(); // This statement throws exception in the HTTP Handler. 
      } 

      catch (Exception exception) 
      { 
       Debug.WriteLine(exception.Message); 
      } 
     } 
    } 
+0

如果沒有看到您的代碼,很難判斷出現了什麼問題。請告訴我們你已經嘗試了什麼。 – 2011-02-27 14:21:17

回答

5

你可以設置一個靜態時間來開始你的工作。

private static DateTime startTime = DateTime.Now.AddSeconds(5); //arbitrary start time 

static void Main(string[] args) 
{ 
    ThreadStart threadStart1 = new ThreadStart(DoSomething); 
    ThreadStart threadStart2 = new ThreadStart(DoSomething); 
    Thread th1 = new Thread(threadStart1); 
    Thread th2 = new Thread(threadStart2); 

    th1.Start();    
    th2.Start(); 

    th1.Join(); 
    th2.Join(); 

    Console.ReadLine(); 
} 

private static void DoSomething() 
{ 
    while (DateTime.Now < startTime) 
    { 
     //do nothing 
    } 

    //both threads will execute code here concurrently 
} 
+0

謝謝史蒂夫,我試過這段代碼,但它不能重現異常,有沒有其他方法可以調試它? – Raghu 2011-02-27 14:35:47

+0

我會產生更多的線程,直到它發生,如果它沒有發生,那麼你的問題可能在別處。另外,請參閱我的編輯,直到全部啓動它們之後,纔會加入生成的線程。抱歉。 – 2011-02-27 17:07:16