Лучший способ справиться с отменой асинхронных загрузок веб-клиента - PullRequest
1 голос
/ 29 апреля 2011

Я надеялся, что кто-нибудь сможет пролить свет на кажущуюся сложной проблему, с которой я сталкиваюсь при асинхронной загрузке веб-клиента в silverlight.Вот подробности моей проблемы -

Загрузка многостраничного веб-запроса XML.Перемещен код веб-клиента во вспомогательный класс для отслеживания каждого отдельного запроса.Вспомогательный класс называется SyncJobsClass.Источник для этого класса: (http://www.silvergeek.net/silverlight/running-async-tasks-synchronously-events-delegates/)

Имеется кнопка загрузки для запуска задачи -

void button1_Click(object sender, RoutedEventArgs E)
{
var req = new RequestClass;
req.GetXMLPages();
}

Вот класс запроса -

Public Class RequestClass
{
readonly SyncJobsClass _syncJobs = new SyncJobsClass();

Public void GetXMLPages()
{

_syncJobs += new SyncJobsElementCompleted;
_syncJobs += new SycJobsWorkCompleted;

var pages = 10

   for(var i=0;i<10;i++)
   {
      //load each request into list in _syncjobs class
      var url ="www.blahblahblah.com" + i;
      _syncJobs.DownloadFiles(url);

   }
      //start download of each page in list
     _syncJobs.StartDownload();

}


}

Так как выпосле этого шага я вижу очередь страниц, загружаемых асинхронно. Когда страницы завершаются, я передаю их в формататор XML Linq, а затем связываю полученные данные с моей моделью представления.

void SyncJobsElementCompleted(string result)
{

if(result == "error")return;

//send data to XML linq parser and add to observable collection for viewmodel.
App.ViewModel.LoadData(result);


}

Проблема заключается вбольшие загрузки, если я создаю новый экземпляр GetXMLPages () нажатием кнопки загрузки, предыдущая загрузка еще не завершена, и я получаю смешанные результаты в модели просмотра. Я попытался изменить событие кнопки на -

void button1_Click(object sender, RoutedEventArgs E)
    {
    var req = new RequestClass;

    //Clear view model before download
     App.Viewmodel.List.Clear()
   // now get pages
    req.GetXMLPages();
    }

Ну, это не работает, так как загрузка все еще идет в другом потоке ..

Попробовал boolen, но это будет допустимо только для этого экземпляра RequestClass, который воссоздается при каждом нажатии кнопки ..

Как я могу предотвратить запуск другой загрузки перед созданием нового запроса? Если вам нужно больше деталей, дайте мне знать. Любая помощь будет очень полезнаоценили.

1 Ответ

0 голосов
/ 29 апреля 2011

Я думаю, что логический путь - правильный путь - я сталкивался с подобной ситуацией раньше и использовал логическое значение для решения моей проблемы.Вы можете попытаться сохранить логическое значение в своем классе приложения, чтобы оно не создавалось заново каждый раз, когда вы создаете новый RequestClass.

...