2010-06-14 65 views
0

我想下載一個sql語句後下載很多文件必須插入一條記錄。 我正在使用System.Net.Client同步下載每個文件,但仍然可以異步完成。每次下載之間沒有關係或依賴關係。下載一堆文件異步等待,直到上一次完成

起初,我只是試圖使用WebClient.DownloadFileAsync,但關閉了程序並殺死了所有的下載進程/線程。其次,我試圖創建一個像這樣的等待例程;

while (processedFiles < totalFiles) 
     Thread.Sleep(1000) 

這凍結了一切。那麼有人能告訴我採取哪種方式來實現這種異步?

+0

你是什麼意思「關閉程序?」。也許你正在打破例外?嘗試獲取日誌(有關說明,請參閱http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html)。並把你的tracelog放到pastebin.com上,我們可以看看。 – feroze 2010-06-17 01:15:34

+0

那麼「關閉程序」不是發生了什麼,它只是繼續它的正常流程。這是一個SSIS腳本任務,它可以與沒有暫停/等待輸入的Windows Shell程序進行比較。所以一切都在進行,但是由於主流程已經完成,整個'程序'(任務)繼續進行,異步進程被終止。我希望我有更多的錯誤/日誌細節,但就是這樣。當我在調試中運行SSIS任務並停止帶有斷點的主進程時,下載過程可以正確完成。 – 2010-06-17 08:21:31

回答

0

理想情況下,您只需使用DownloadFileAsync,然後連接DownloadFileCompleted事件以在下載完成時通知您。下面是代碼如何可能的電纜鋪設事件樣片:

// Sample call : DownLoadFileInBackground2 ("http://www.contoso.com/logs/January.txt"); 
public static void DownLoadFileInBackground2 (string address) 
{ 
    WebClient client = new WebClient(); 
    Uri uri = new Uri(address); 

    // Specify that the DownloadFileCallback method gets called 
    // when the download completes. 
    client.DownloadFileCompleted += new AsyncCompletedEventHandler (DownloadFileCallback2); 
    // Specify a progress notification handler. 
    client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback); 
    client.DownloadFileAsync (uri, "serverdata.txt"); 
} 

您可以從一個WinForms應用中,當下載正在進行這將只是被閒置調用它。然後,當所有下載完成後,您可以關閉該程序或您需要執行的任何操作。

+0

嗨賈斯汀, 這是我用過的相同的代碼。從來沒有這樣的畫面;我有一個uri下載的數組,我做了一個foreach循環來執行client.DownloadFileAsync。在循環完成後,整個應用程序關閉(如沒有暫停的控制檯應用程序) – 2010-06-15 07:22:55

+0

嗯...下載客戶端設計爲在處理事件的應用程序內工作。應用程序需要閒置並處理事件而不是關閉。一個簡單的方法可能是將應用程序遷移到Windows窗體,並在下載文件時放置某種進度對話框。 – 2010-06-15 14:19:40