我可以“;取消”;在更新面板中发生的长时间运行的进程

Can I "cancel" a long-running process that is happening within an updatepanel?

本文关键字:运行 进程 长时间 取消 我可以 更新      更新时间:2023-09-26

我有一个更新面板,它包含一个下拉列表,一旦页面加载完成,它就会用最新数据填充下拉列表。数据抓取可能需要长达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"是我创建的一个对象,它继承了IEnum可耕,并具有一个公开的public List<DictionaryEntry>,这就是"Key"answers"Value"的作用所在。

当调用构造函数时,它会转到Web服务并获取我要用于下拉列表的数据。这个获取几乎需要3分钟才能完成,然后将其存储到我的数据库中。然后,我获取数据库表并填充public List<DictionaryEntry>,然后将其返回到更新面板以供使用。

该体系结构用于获取(其第三方)的方式是,我(通过web服务)对数据对象发出请求。它会立即为结果返回一个唯一的标识符。然后,我使用服务中的另一个方法,并传入唯一ID来检查数据的状态。我每10秒循环检查一次。一旦它返回"完整"消息,我就使用相同的唯一ID来获取实际数据:

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循环中加入一个齿轮来阻止它。

感谢阅读。

您可以调用.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

您可以将UpdateProgress添加到页面和ProgressTemplate放置,这将取消回发,您将有机会在代码中处理取消。此外,您应该将其他答案中的代码添加到此按钮,以取消返回的帖子。