Я загружаю два файла JSON из Интернета, после чего хочу разрешить загрузку двух страниц, но не раньше. Однако ManualResetEvent
, который необходимо установить для загрузки страницы, никогда не «срабатывает». Хотя я знаю, что он устанавливается, WaitOne
никогда не возвращается.
Метод запуска загрузок:
private void Application_Launching(object sender, LaunchingEventArgs e)
{
PhoneApplicationService.Current.State["doneList"] = new List<int>();
PhoneApplicationService.Current.State["manualResetEvent"] = new ManualResetEvent(false);
Helpers.DownloadAndStoreJsonObject<ArticleList>("http://arkad.tlth.se/api/get_posts/", "articleList");
Helpers.DownloadAndStoreJsonObject<CompanyList>("http://arkad.tlth.se/api/get_posts/?postType=webbkatalog", "catalog");
}
Метод загрузки, который устанавливает ManualResetEvent
public static void DownloadAndStoreJsonObject<T>(string url, string objName)
{
var webClient = new WebClient();
webClient.DownloadStringCompleted += (sender, e) =>
{
if (!string.IsNullOrEmpty(e.Result))
{
var obj = ProcessJson<T>(e.Result);
PhoneApplicationService.Current.State[objName] = obj;
var doneList = PhoneApplicationService.Current.State["doneList"] as List<int>;
doneList.Add(0);
if (doneList.Count == 2) // Two items loaded
{
(PhoneApplicationService.Current.State["manualResetEvent"] as ManualResetEvent).Set(); // Signal that it's done
}
}
};
webClient.DownloadStringAsync(new Uri(url));
}
Метод ожидания (в данном случае конструктор)
public SenastePage()
{
InitializeComponent();
if ((PhoneApplicationService.Current.State["doneList"] as List<int>).Count < 2)
{
(PhoneApplicationService.Current.State["manualResetEvent"] as ManualResetEvent).WaitOne();
}
SenasteArticleList.ItemsSource = (PhoneApplicationService.Current.State["articleList"] as ArticleList).posts;
}
Если я подожду, прежде чем пытаться получить доступ к этому конструктору, он легко пройдет оператор if и не попадет в WaitOne
, но если я вызову его немедленно, я застряну, и он никогда не вернется...
Любые идеи?
DownloadStringCompleted
WebClient выполняется в потоке пользовательского интерфейса, в том самом потоке, который вы блокируете с помощью событияWaitOne
. В любом случае вам следует любой ценой избегать блокировки потока пользовательского интерфейса. Пока вы ожидаете данные, лучше отображать анимацию загрузки. - person Kevin Gosse   schedule 20.10.2013DownloadStringCompleted
не будет запущено, и событие ожидания никогда не будет установлено. - person Kevin Gosse   schedule 20.10.2013