ASP.Net Асинхронная страница с Action.BeginInvoke - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь написать асинхронную страницу в 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 Ответ

1 голос
/ 10 октября 2011

Я считаю, что вам нужно передать объект AsyncCallback, предоставленный вам в параметрах метода BeginAsyncOperation, в BeginInvoke, а не создавать новый.

Ваши страницы загружаются синхронно из-за конфигурации вашего сеанса.

Доступ к состоянию сеанса ASP.NET является эксклюзивным для каждого сеанса, что означает, что если два разных пользователя делают параллельные запросы, доступ к каждому отдельному сеансу предоставляется одновременно. Однако, если два одновременных запроса сделаны для одного и того же сеанса (с использованием одного и того же значения SessionID), первый запрос получает эксклюзивный доступ к информации сеанса. Второй запрос выполняется только после того, как первый запрос завершен. (Второй сеанс также может получить доступ, если исключительная блокировка информации освобождена, поскольку первый запрос превышает время ожидания блокировки.) Если значение EnableSessionState в Директива @ Page имеет значение ReadOnly, запрос информации о сеансе только для чтения не приводит к исключительной блокировке данных сеанса. Однако запросы только для чтения для данных сеанса, возможно, все еще должны ждать блокировки, установленной запросом на чтение и запись, для очистки данных сеанса.

Источник: Обзор состояния сеанса ASP.NET , мое выделение.

...