2010-11-09 3 views
0

У меня есть класс, который идет и захватывает некоторые данные и возвращает его как строку. Пока этот объект работает, есть значок поворота, позволяющий пользователю знать, что работа выполняется. Проблема в том, что код выходит до ответа. Я застрялАльтернатива этому запросу Http

while(response == null) 

только, чтобы видеть, что происходит и

response = (HttpWebResponse)request.EndGetResponse(AsyncResult); 

не стреляя. Он стреляет нормально в консольном приложении, поэтому я кладу это вниз к чему-то, что я делаю, что Silverlight не нравится, Херес полного кода:

public class HttpWorker 
{ 
    private HttpWebRequest request; 
    private HttpWebResponse response; 
    private string responseAsString; 
    private string url; 

    public HttpWorker() 
    { 

    } 

    public string ReadFromUrl(string Url) 
    { 
     url = Url; 
     request = (HttpWebRequest)WebRequest.Create(url); 

     request.CookieContainer = new CookieContainer(); 
     request.AllowAutoRedirect = true; 
     request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6"; 

     AsyncRequest(); // The Demon! 

     return responseAsString; 
    } 

    private void AsyncRequest() 
    { 
     request.BeginGetResponse(new AsyncCallback(FinaliseAsyncRequest), null); 
    } 

    private void FinaliseAsyncRequest(IAsyncResult AsyncResult) 
    { 
     response = (HttpWebResponse)request.EndGetResponse(AsyncResult); 


     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      // Create the stream, encoder and reader. 
      Stream responseStream = response.GetResponseStream(); 
      Encoding streamEncoder = Encoding.UTF8; 
      StreamReader responseReader = new StreamReader(responseStream, streamEncoder); 
      responseAsString = responseReader.ReadToEnd(); 
     } 
     else 
     { 
      throw new Exception(String.Format("Response Not Valid {0}", response.StatusCode)); 
     } 
    } 

} 

ответ

1

ли вы собираетесь в занятую петлю с (while response == null) в потоке пользовательского интерфейса ? Асинхронный обратный вызов для HttpRequest будет доставлен в поток пользовательского интерфейса, поэтому, если вы зацикливаетесь на том же потоке, обратный вызов никогда не будет работать. Вам нужно вернуться, чтобы разрешить запуск основного цикла сообщений, а затем будет передан ваш асинхронный обратный вызов.

Ваш дизайн, приведенный выше, предполагает, что вы действительно хотите получить синхронную выборку в любом случае. Забудьте обратный вызов и просто позвоните FinaliseAsyncRequest внутри ReadFromUrl самостоятельно. Пользовательский интерфейс будет висеть до тех пор, пока запрос не завершится, но похоже, что вы этого хотите.

+0

Хмм подвеска также остановит любую «ожидающую» графику или что у меня все получилось. Думаю, мне нужно перепроектировать. Я просто не уверен, как данные необходимы для продолжения работы с приложением. – deanvmc

+0

Обратный вызов из 'HttpWebRequest' не выполняется в потоке пользовательского интерфейса. 'WebClient' запускает обратный вызов в потоке пользовательского интерфейса. –

+0

Я запутался в ответе, как он мог вызвать FinaliseAsyncRequest изнутри ReadFromUrl? Запрос никогда не будет выпущен, верно? Я пытаюсь выполнить одно и то же, возвращая значение из метода, который делает запрос. – CACuzcatlan

0

Самый простой способ получить строку с веб-сервера - использовать WebClient.DownloadStringAsync() (MSDN docs).

Попробуйте что-то вроде этого:

private void DownloadString(string address) 
{ 
    WebClient client = new WebClient(); 
    Uri uri = new Uri(address); 

    client.DownloadStringCompleted += DownloadStringCallback; 
    client.DownloadStringAsync(uri); 

    StartWaitAnimation(); 
} 


private void DownloadStringCallback(object sender, DownloadStringCompletedEventArgs e) 
{ 
    // Do something with e.Result (which is the returned string) 

    StopWaitAnimation(); 
} 

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

Если вам требуется больше контроля над веб-запросом, вы можете использовать HttpWebRequest.

Если вы действительно должны имитировать синхронное поведение взглянуть на Faking synchronous calls in Silverlight WP7

1

я отправил рабочий образец здесь с помощью WebClient и HttpWebRequest.

WebClient, HttpWebRequest and the UI Thread on Windows Phone 7

Примечание последний является предпочтительным для любой нетривиальной обработки, чтобы избежать блокировки пользовательского интерфейса.

Не стесняйтесь использовать код.

+0

Я проверю это и вернусь к вам. – deanvmc

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