C# 带有Action.BeginInvoke的ASP.Net异步页面

C# 带有Action.BeginInvoke的ASP.Net异步页面,c#,asp.net,action,begininvoke,iasyncresult,C#,Asp.net,Action,Begininvoke,Iasyncresult,我正在尝试在asp.net中编写一个异步页面,它在不同的线程中运行一个函数。 下面代码中的问题是,当我调试它时,从未调用函数EndAsyncOperation。因此,页面并没有完全加载,并且永远不会加载。 我使用Action在线程池的不同线程中运行代码。是否有其他方法可以在不同的线程中运行代码 我哪里做错了 还有一个问题。我读到ASP.Net中的页面是用线程池运行的。那么,当我调试我的站点并尝试一起加载几个页面时,它们是一个接一个地同步加载的,这是怎么回事呢 public partial cla

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

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

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

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


来源:,我的亮点。

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

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

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


资料来源:,我的重点。

请每个问题只问一个问题。请每个问题只问一个问题。