2011-10-09 82 views
1

我試着寫在ASP .NET異步頁它運行在不同的線程功能。 以下代碼中的問題是,當我調試它時,函數EndAsyncOperation從不會被調用。因此,該頁面未完全加載並永久加載。 我使用Action來運行線程池中不同線程中的代碼。是否有另一種方法可以在不同的線程中運行代碼?ASP.Net異步頁與Action.BeginInvoke

我哪裏錯了?

還有一個問題。我在ASP.Net中讀到這些頁面是用一個線程池運行的。那麼,當我調試我的網站,並嘗試加載幾個頁面在一起,他們一個接一個地同步加載?

public partial class AsyncPage : System.Web.UI.Page 
{ 
    void Page_Load(object sender, EventArgs e) 
    { 
     AddOnPreRenderCompleteAsync(
      new BeginEventHandler(BeginAsyncOperation), 
      new EndEventHandler(EndAsyncOperation) 
     ); 
    } 

    IAsyncResult BeginAsyncOperation(object sender, EventArgs e, 
     AsyncCallback cb, object state) 
    { 
     Action action =() => 
      { 
       Start(); 
      }; 

     IAsyncResult asyncResult = action.BeginInvoke(new AsyncCallback(action.EndInvoke), null); 

     return asyncResult; 
    } 

    void EndAsyncOperation(IAsyncResult ar) 
    { 
     // This function isn't reached 
    } 

    public void Start() 
    { 
     // Do something 
    } 
} 
+0

請每個問題只問一個問題。 –

回答

1

我相信,你需要通過在BeginAsyncOperation方法參數的BeginInvoke提供給您的AsyncCallback的對象,而不是創建一個新的。

您的網頁加載,因爲你的會話配置的同步。

訪問ASP.NET會話狀態是每個會話獨佔的,這意味着如果兩個不同的用戶發出併發請求,則同時授予對每個單獨會話的訪問權限。 但是,如果爲同一會話(通過使用相同的SessionID值)提出兩個併發請求,則第一個請求將獲得對會話信息的獨佔訪問權限。第二個請求僅在第一個請求完成後執行。(如果由於第一個請求超過了鎖定超時而對信息的排他鎖被釋放,第二個會話也可以訪問。)如果@ Page指令中的EnableSessionState值設置爲ReadOnly,只有會話信息不會導致對會話數據的獨佔鎖定。但是,會話數據的只讀請求可能仍然需要等待由會話數據的讀寫請求設置的鎖定清除。

來源:ASP.NET Session State Overview,我的亮點。