带Action.BeginInvoke的ASP.Net异步页面

时间:2011-10-09 20:27:57

标签: c# asp.net action begininvoke iasyncresult

我正在尝试在asp .net中编写异步页面,该页面在不同的线程中运行一个函数。 以下代码中的问题是,当我调试它时,永远不会调用函数EndAsyncOperation。因此,页面未完全加载并永远加载。 我使用Action在线程池的不同线程中运行代码。是否有另一种方法可以在不同的线程中运行代码?

我哪里错了?

另一个问题。我在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
    }
}

1 个答案:

答案 0 :(得分:1)

我认为您需要将BeginAsyncOperation方法参数中提供给您的AsyncCallback对象传递给BeginInvoke,而不是创建一个新对象。

由于您的会话配置,您的网页会同步加载。

  

对每个会话的访问ASP.NET会话状态是独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。 但是,如果对同一会话发出两个并发请求(通过使用相同的SessionID值),则第一个请求将获得对会话信息的独占访问权。第二个请求仅在第一个请求完成后执行。(如果由于第一个请求超过锁定超时而释放信息的独占锁定,则第二个会话也可以访问。)如果EnableSessionState值为@ Page指令设置为ReadOnly,对只读会话信息的请求不会导致会话数据的独占锁定。但是,会话数据的只读请求可能仍然需要等待会话数据的读写请求设置的锁定才能清除。

来源:ASP.NET Session State Overview,我的亮点。