2011-10-09 45 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,我的亮点。