CookieContainer を備えた Webclient を使用して、Web サービス (Sharepoint) からデータをダウンロードしています。
DownloadDataAsync を使用して、複数のドキュメントをダウンロードし、ダウンロード時にドキュメントごとに 1 つのプログレス バーを更新したいと考えています。非非同期バージョン - DownloadData は進行状況の更新を送信しません。
- 次のドキュメントに移動する前に、Async バージョンを doc.BinaryData = xx 行で待機させるにはどうすればよいですか?
- DownloadFileCompleted イベントからバイト配列を取得するにはどうすればよいですか?
DoEvents を使用せずにプログレスバーに変更を適用するにはどうすればよいですか?
部分クラス Form() { void Main() { List urls= new List(); //urls.Add("xxxxxxx"); //どこかから取得
for (int i = 0; i < urls.Count; i++) { var doc = new Document(); doc.BinaryData = DocumentAsArray(urls.ElementAt(i)); entities.AddToDocument(doc); } } public byte[] DocumentAsArray(string URL) { byte[] @return = null; using (CookieAwareWebClient client = new CookieAwareWebClient()) { client.CookieContainer = spAuthentication.CookieContainer; // Assign the events to capture the progress percentage client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted); client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); client.DownloadDataAsync(new Uri(URL)); } return @return; } void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { progressBarControlFile.Position = e.ProgressPercentage; var newPc = string.Format("Downloaded {0} %", e.ProgressPercentage); labelControlFile.Text = newPc; Application.DoEvents(); } void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) { progressBarControlFile.Position = progressBarControlFile.Properties.Maximum; labelControlFile.Text = string.Format("{0} %", progressBarControlFile.Properties.Maximum); Application.DoEvents(); }
}
public class CookieAwareWebClient : WebClient { public CookieContainer CookieContainer { get; 設定; }
protected override WebRequest GetWebRequest(Uri address) { WebRequest request = base.GetWebRequest(address); var webRequest = request as HttpWebRequest; if (webRequest != null) { webRequest.CookieContainer = this.CookieContainer; webRequest.KeepAlive = false; } return request; }
} }