2012-06-26 3 views
0

Мой метод uriRead, кажется, возвращается до завершения асинхронной загрузки, в результате чего возвращается «» методом. Если я поставлю Thread.Sleep (5000) в «// Wait here?» однако он будет завершен.Метод C#, возвращаемый перед обработчиком события, называется

Как я могу заставить эту функцию дождаться завершения загрузки строки и вернуть ее, как только это произойдет, без ввода статической задержки?

public string uriRead(string uri) 
    { 
     string result = ""; 
     WebClient client = new WebClient(); 
     client.Credentials = CredentialCache.DefaultCredentials; 
     client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(AsyncReadCompleted); 
     client.DownloadStringAsync(new Uri(uri)); 
     // Wait here? 
     return result = downloadedAsyncText;  
    } 

    public void AsyncReadCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     Console.WriteLine("Event Called"); 
     downloadedAsyncText = e.Result.ToString(); 
     Console.WriteLine(e.Result); 
    } 
+10

Умм .. вы действительно знаете, что означает асинхронный? Почему это асинхронно, если вы просто собираетесь его ждать? –

+0

http://msdn.microsoft.com/en-us/library/system.net.webclient.downloadstring.aspx Нет Async – Joe

+0

Вы пытаетесь написать приложение для Windows 8? – dlev

ответ

0

Извините, но, как упоминалось выше, если вы используете Async, вы должны использовать его должным образом. Результаты должны быть прочитаны в DownloadStringCompletedEventHandler, вам не следует ждать, это может заблокировать ваше приложение. Ваше приложение должно оставаться отзывчивым. Что делать, если метод никогда не возвращается?

Вам необходимо создать приватное поле в своем классе private string results_, установленное в обработчике событий.

0

Если вы хотите дождаться результата, вы хотите сделать это синхронно, а не асинхронно, как упомянуто другими. Поэтому используйте метод DownloadString вместо DownloadStringAsync.

public string uriRead(string uri) 
{ 
    WebClient client = new WebClient(); 
    client.Credentials = CredentialCache.DefaultCredentials;  
    return client.DownloadString(new Uri(uri)); 
} 
Смежные вопросы