using(WebClient oWebClient = new WebClient()) { // use an event for waiting, rather than a Thread.Sleep() loop. var notifier = new AutoResetEvent(false); oWebClient.Encoding = System.Text.Encoding.UTF8; long lReceived = 0; long lTotal = 0; // Set up a delegate to watch download progress. oWebClient.DownloadProgressChanged += delegate(object sender, DownloadProgressChangedEventArgs e) { Console.WriteLine(e.ProgressPercentage + "% (" + e.BytesReceived / 1024f + "kb of " + e.TotalBytesToReceive / 1024f + "kb)"); // Assign to outer variables to allow busy-wait to check. lReceived = e.BytesReceived; lTotal = e.TotalBytesToReceive; }; // Set a delegate to watch for when the download is complete oWebClient.OpenReadCompleted += delegate(object sender, OpenReadCompletedEventArgs e) { // Indicate that things are done notifier.Set(); }; oWebClient.DownloadFileAsync(new Uri(sUrl + "?" + sPostData), sTempFile); // wait for signal to proceed notifier.WaitOne(); }
I extended @OJ's answer instead to set a notifier when OpenReadCompleted . This will stop the thread from freezing if file errors occur during download.
Link: WebClient DownloadFileAsync hanging
Daniel - SDS Group
source share