0

非同期ダウンロードが完了する前に uriRead メソッドが返されたように見えるため、メソッドによって "" が返されます。「// Wait here?」に Thread.Sleep(5000) を配置すると、ただし、行は完了します。

文字列のダウンロードが完了するのを待って、静的な遅延を入力せずにすぐに戻るようにこの関数を作成するにはどうすればよいですか?

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);
    }
4

2 に答える 2

0

結果を待ちたい場合は、他の人が述べたように非同期ではなく、同期的に実行する必要があります。そのため、DownloadStringAsync の代わりに DownloadString メソッドを使用してください。

public string uriRead(string uri)
{
  WebClient client = new WebClient();
  client.Credentials = CredentialCache.DefaultCredentials;      
  return client.DownloadString(new Uri(uri));
}
于 2012-06-26T18:04:02.597 に答える
0

申し訳ありませんが、非同期を使用している場合は、適切に使用する必要があります。結果は で読み取られるはずDownloadStringCompletedEventHandlerです。待機しないでください。アプリケーションがブロックされる可能性があります。アプリケーションは応答性を維持する必要があります。メソッドが返されない場合はどうなりますか?

private string results_ イベント ハンドラーで設定するプライベート フィールドをクラスに作成する必要があります。

于 2012-06-26T17:12:03.783 に答える