Он асинхронный, но рекомендуется не выполнять какую-либо нетривиальную обработку с использованием WebClient, поскольку эта работа будет выполняться в потоке пользовательского интерфейса, как Indy правильно указывает.
Webclient делает это, чтобы предложить вам возможность не обращаться к диспетчеру.
Dispatcher.BeginInvoke(() => { /* ui update code */ });
Это происходит за счет ВСЕХ вашей обработки в обратном вызове, выполняемых в потоке пользовательского интерфейса.
HttpWebRequest (используемый самим WebClient) позволит вам сохранить большую часть вашей обработки с потоком пользовательского интерфейса и просто обновлять свои пользовательские интерфейсы в потоке пользовательского интерфейса через диспетчер (см. Выше).
Обратите внимание, что вы все равно можете заблокировать поток пользовательского интерфейса, если вы делаете это со слишком большой интенсивностью. Интервал обновлений вашего интерфейса с помощью Thread.Sleep (xxx) поможет сохранить пользовательский интерфейс в таких случаях.
Для более глубокого понимания различий между HttpWebRequest и WebClient и образца рабочего проекта для демонстрации см. Мой пост здесь.
WebClient, HttpWebRequest and the UI Thread on Windows Phone 7
К сожалению, события INotifyPropertyChanged не отправляются в поток пользовательского интерфейса –