У меня есть панель обновления, которая содержит раскрывающийся список, который после завершения загрузки страницы запустится и заполнит раскрывающийся список самыми последними данными. Сбор данных может занять до 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, чтобы остановить это.
Спасибо за чтение.