2013-04-07 4 views
1

Я хочу загрузить данные не асинхронно в приложении Windows Phone. Я бы сделал класс загрузчика и имел простой способ загрузить строку из URL-адреса. На других платформах я бы использовал:Как загрузить данные не асинхронно?

public class TextDownloader 
{ 
     public string GetString(string url) 
     { 
      WebClient web = new WebClient(); 
      string s = web.DownloadString("http://www.google.com"); 
      return s; 
     } 
} 

Было бы хорошо работать: простой, минимальный код. Тем не менее, метод WebClient.DownloadString недоступен на Windows Phone 7 и не много параметров WebRequest. Существуют ли альтернативные способы загрузки данных несинхронно в Windows Phone? Я бы предпочел не создавать несколько событий для загрузки и ошибки, просто попробуйте просто вернуть значение или выбросить исключение.

+0

@lelyor, Что это касается этого вопроса? – DaveShaw

+0

Вы должны использовать асинхронный способ избежать блокировки потока пользовательского интерфейса - вот как это делается в WP в наши дни. –

+0

@igrali Я знаю, что это совершенно старый вопрос, но в этой ситуации я бы назвал синхронный метод загрузки в потоке, отличном от UI. – msbg

ответ

5

Действительно, вы не можете использовать синхронную модель для загрузки с WebClient из коробки. Это по дизайну, и учитывая характер приложений Windows Phone, вы должны следовать этой методологии.

Решение проблемы - callbacks. Вы можете легко реорганизовать функцию к чему-то вроде этого:

public void GetString(string url, Action<string> onCompletion = null) 
{ 
    WebClient client = new WebClient(); 
    client.DownloadStringCompleted += (s, e) => 
     { 
      if (onCompletion != null) 
       onCompletion(e.Result); 
     }; 
    client.DownloadStringAsync(new Uri(url)); 
} 

Это делает его относительно легко использовать и вызвать действие, когда оно будет завершено. Есть и другой способ сделать это, и это - async/await. Вам нужно будет установить Bcl.Async пакет через NuGet:

Install-Package Microsoft.Bcl.Async -Pre 

Это позволит вам сделать это:

public async Task<string> DownloadString(string url) 
{ 
    WebClient client = new WebClient(); 
    return await client.DownloadStringTaskAsync(url); 
} 

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

+0

Просто записка. Последний фрагмент кода может работать ТОЛЬКО с VS 2012, даже если он работает с .net 4.0, так как он использует C# 5.0 – Aron

+0

Это было бы правильно. –

Смежные вопросы