Могу ли я «отменить» длительный процесс, происходящий внутри панели обновления? - PullRequest
4 голосов
/ 06 июня 2011

У меня есть панель обновления, которая содержит раскрывающийся список, который после завершения загрузки страницы запустится и заполнит раскрывающийся список самыми последними данными. Сбор данных может занять до 3 минут. Могу ли я выбрать, чтобы пользователь «отменил» запрос и просто использовал последнюю версию данных?

В панели обновлений у меня есть несвязанный выпадающий список (во время разработки). Как только страница завершает рендеринг, я вызываю javascript событие button.click внутри панели обновления для извлечения данных:

private void RefreshDDL()
{
    hidAction.Value = "";
    ddlCampaigns.DataSource = myDataSource;
    ddlCampaigns.DataTextField = "Value";
    ddlCampaigns.DataValueField = "Key";
    ddlCampaigns.DataBind();
    ddlCampaigns.Visible = true;

    pnlDetails.Attributes.CssStyle.Clear();
    pnlPleaseWait.Visible = false;
    btnOK.Enabled = true;
}

Объект "myDataSource" - это созданный мной объект, который наследует IEnumarable и имеет открытый public List<DictionaryEntry>, в котором вступают в игру "Ключ" и "Значение".

Когда вызывается конструктор, он попадает в веб-сервис и выбирает данные, которые я хочу использовать для раскрывающегося списка. Эта выборка занимает почти 3 минуты, а затем сохраняет ее в моей базе данных. Затем я беру таблицу базы данных и заполняю public List<DictionaryEntry>, затем она возвращается на панель обновления для потребления.

Способ, которым архитектура работает для выборки (ее третьей стороны), заключается в том, что я размещаю запрос (через веб-сервис) для объекта данных. Он немедленно возвращает уникальный идентификатор для результатов. Затем я использую другой метод из службы и передаю уникальный идентификатор для проверки состояния данных. Я проверяю эту петлю каждые 10 секунд. Как только он возвращает «завершенное» сообщение, я использую тот же уникальный идентификатор для извлечения фактических данных:

private void RefreshList()
{
    MyProxy proxyRequest = new MyProxy ();
    List<string> myList= new List<string>();
    if (UpdateNeeded())
    {
        ProgramManagement.ThirdPartyServiceApi.runReport report = new ProgramManagement.ThirdPartyServiceApi.runReport();
        report.reportName = "MyData";
        try
        {
            ProgramManagement.ThirdPartyServiceApi.runReportResponse response = proxyRequest.runReport(report);

            while (!ReportComplete(response.@return))
            {
                System.Threading.Thread.Sleep(10000);
            }
            StoreList(GetReport(response.@return));
        }
        catch (SoapException ex)
        {
            if (ex.Message == TOO_MANY_REQUESTS)
            {
                //display a message maybe?
            }
        }
    }

    AddDataToList();

}

Есть ли способ остановить этот процесс в середине потока? Я полагаю, что я бы хотел включить шестеренку в цикл while, чтобы остановить это.

Спасибо за чтение.

Ответы [ 2 ]

1 голос
/ 06 июня 2011

Вы можете позвонить .abortPostBack();, чтобы отменить запрос Ajax

function CancelPostBack() {

var objMan = Sys.WebForms.PageRequestManager.getInstance();

if (objMan.get_isInAsyncPostBack())

    objMan.abortPostBack();

}

Подробнее см. http://www.codedigest.com/Articles/ASPNETAJAX/125_Using_UpdateProgress_Control_Effectively.aspx

0 голосов
/ 07 июня 2011

Вы можете добавить UpdateProgress на свою страницу и внутри пута ProgressTemplate, и это отменит обратную передачу, и у вас будет возможность обработать отмену в своем коде.Также вы должны добавить код из других ответов к этой кнопке, чтобы отменить пост обратно.

...