Tôi đang sử dụng mã dưới đây để tải nhiều file đính kèm từ một máy chủ TFS:WebClient.DownloadFileAsync - Tải file cùng một lúc
foreach (Attachment a in wi.Attachments)
{
WebClient wc = new WebClient();
wc.Credentials = (ICredentials)netCred;
wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
wc.DownloadFileAsync(a.Uri, "C:\\" + a.Name);
}
Tôi muốn tải nhiều dữ liệu sử dụng DownloadFileAsync, nhưng tôi muốn họ được tải xuống từng cái một.
Người ta có thể hỏi "Tại sao bạn không sử dụng phương thức DownloadFile đồng bộ?" Bởi vì:
- Tôi muốn sử dụng các sự kiện được cung cấp bởi DownloadFileAsync.
- Tôi không muốn tạo nhiều phiên bản của Webclient để tránh làm ngập máy chủ.
Đây là giải pháp mà tôi nghĩ đến:
foreach (Attachment a in wi.Attachments)
{
WebClient wc = new WebClient();
wc.Credentials = (ICredentials)netCred;
wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
wc.DownloadFileAsync(a.Uri, "C:\\" + a.Name);
while (wc.IsBusy)
{
System.Threading.Thread.Sleep(1000);
}
}
Tuy nhiên, có một vài vấn đề với cách tiếp cận này:
- Các Thread.Sleep() được khóa lên của tôi Hình thức. Tôi vẫn cần tạo chủ đề của riêng mình hoặc sử dụng BackgroundWorker. (Tôi muốn tránh điều này càng nhiều càng tốt)
- Sự kiện DownloadFileCompleted đang được kích hoạt sau khi TẤT CẢ tệp đã được tải xuống. Tôi không biết nếu đây là một tác dụng phụ của việc sử dụng System.Threading.Thread.Sleep (1000);
Có cách nào tốt hơn để tải xuống từng tệp một lúc bằng WebClient.DownloadFileAsync không?
Cảm ơn!
btw, bạn có thể sử dụng 'System.IO.Path.Combinte (" C: ", a.Name"); ' – abatishchev
Tôi đang cố gắng nhưng một số câu trả lời chỉ đơn giản là không thể chấp nhận được. – Ian
Bạn có thể khắc phục sự cố chặn luồng bằng cách thực hiện việc này: 'while (wc.IsBusy) {}'. Bằng cách này, miễn là 'wc.IsBusy' là' true', việc thực hiện sẽ bị "kẹt" trong dấu ngoặc đơn "không làm gì cả". –