1

我正在尝试在 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
    }
}
4

1 回答 1

1

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

由于您的会话配置,您的页面正在同步加载。

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

来源:ASP.NET 会话状态概述,我的亮点。

于 2011-10-09T23:09:43.887 回答