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